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

このエントリーをはてなブックマークに追加
1v(^o^i)d
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

コンパイラを探しているなら >>2-13 を。
上記を逸した場合の結果は激しく未定義だYO!

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺様に聞け! Part 66
http://pc2.2ch.net/test/read.cgi/tech/1066560665/
2デフォルトの名無しさん:03/11/10 20:39
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
>>1
>>1
5デフォルトの名無しさん:03/11/10 21:39
どっか間違ってる?

/* poly.c */

#include <stdio.h>

#define N (4)

main()
{
floatt, n, x, y, z;
intfact, i, j;
y=0
fact = 1
t=1
for(j = 0; j <= 7; j=j+1){
t=t*x;
for(i = 1; i<= 8; ++i){
fact = fact * i;
 y=y+ t/fact;
}
}
}
>>5
> floatt, n, x, y, z;

定義されていない識別子 floatt,n,x,y,z
>>6
>intfact, i, j;

は指摘しないのか?
行頭以外にタブを使うな
;
xが不定
>#define N (4)

つかってねーし
> y=0
> fact = 1
> t=1
セミコロンは?
藻前ら釣られ放題だな
  ∧_∧
 ( ´∀`)
>>13
皆、わかってて書いてるからいいんでない?
16デフォルトの名無しさん:03/11/11 02:03
与えられた文字(1〜9、A〜Zまで)を2進数にするにはどうすればいいのでしょうか?
ちなみに、ひとつの文字を8ビットで表したいのですが…
どうプログラムしていいのかわからないので教えてください。
char c = 'A', i;
for (i = 1 << 7; i > 0; i >>= 1)
putchar((c & i) ? '1' : '0');
18デフォルトの名無しさん:03/11/11 02:53
B言語はどうやったらできますか?
コンパイラないんでsか・
>>2
あきらめろ
for(c='A'; c<='Z'; c++){
for(i=7; i>=0; i--)
printf("%d", (c>>i) & 0x01);
printf("\n");
}
>>18
shine
>>16
数自体に進数の属性は無い。
表示する時に初めて進数の概念が顔を出してくる。
245:03/11/11 20:18
やってみたけどならない。5の正しいプログラム教えて!!マジで
/* poly.c */
#include <stdio.h>
main() {
float t, n, x, y, z;
int fact, i, j;
y=0;// xも定義しろよ
fact = 1;
t=1;
for(j = 0; j <= 7; j=j+1){
t=t*x;
for(i = 1; i<= 8; ++i){
fact = fact * i;
y=y+ t/fact;
}
}
}
26デフォルトの名無しさん:03/11/11 21:41
>>25
定義しているじゃん
275:03/11/11 22:21
xを定義するって具体的にどうやればいいの?
28デフォルトの名無しさん:03/11/11 22:27
>>27
float x;

やっているんだがな・・・
>>28
いや、初期化してないってことでしょ?

定義はしてるけど
定義じゃなくて初期化って言いたかったんだろう。
それはそれとして、j=j+1 と ++i が同居してるソースって何だか不思議。
>>25
氏んだら?
32  :03/11/11 23:16
printf("%d\n", (*p+i)) ;

printf("%d\n", *(p+i)) ;


両方ともOKなのは気にしなくて良いですか?
>>32
OKとは、どんなことを言う?
説明するのめんどくさいんでもういいです
>>32
#include <stdio.h>
main()
{
int *p,i=4,a[]={14,13,12,11,10};
p=a;
printf("%d\n", (*p+i));
printf("%d\n", *(p+i));
}

結果

18
10
一応動作するという点で OK と言ってるのだろうか。
37デフォルトの名無しさん:03/11/11 23:55
Bus ErrorやSegmentation Faultが動作してもOKか
フリーズしなけりゃ OK 。
>>37
printf("%d\n", (*p+i));
printf("%d\n", *(p+i));

のどちらのコードも、変数の内容次第で発生する可能性はあるものと思われ。
40デフォルトの名無しさん:03/11/12 00:15
>>36
コンパイルが通るかどうかという点でしょう(^-^)
4132:03/11/12 00:22
解説本より

「配列の要素をポインタを使って画面に表示する」

#include<stdio.h>

main()
{
int a[5] = {1, 2, 3, 4, 5} ;
int *p ;
int i ;

p = a ;

for(i=0; i<5; i++)
{
printf("%d\n",*(p+i)) ;
}
}

---------------------------------------


(*p+i)にしても実行結果が変わらなかったので両方ともOKなのかなと思いました。
(解説本には*(p+i)の部分の書き方についての解説がない)
>>41
>int a[5] = {1, 2, 3, 4, 5} ;



 int a[5] = {5,4,3,2,1};

に変えて両方試して見
43デフォルトの名無しさん:03/11/12 00:28
(*p+i)だと1,3,5,7,9にならない?
4461:03/11/12 00:30
>>43
寝言は寝て言え
45デフォルトの名無しさん:03/11/12 00:31
ならないな・・・
>>43
p++ があればな。
4743:03/11/12 00:32
あ、pを進ませていなかった(笑)
4843:03/11/12 00:32
>>46
だね(笑)
>>41
わらた。
初期値が絶妙だな。
(*p+i)は(*p)+i
()は結合優先順位の高い演算子でしかない。
*(p + 1) はポインタ *p が保持する中身=アドレス(p)を型の分+1した上での中身を示す。
*(p + 1) はポインタ変数 p が保持するポインタに1加えたものの参照先を示す。
ポインタに1を加えると、そのアドレスは型のサイズだけ増える。
*p + 1 はポインタ変数 p の参照先に1を加えた値を示す。
53デフォルトの名無しさん:03/11/12 02:08
バッファオーバーフローでroot権限を奪取する方法を教えて
イヤです。
55デフォルトの名無しさん:03/11/12 02:16
バッファオーバーフローでroot権限を奪取する方法を教えて
56デフォルトの名無しさん:03/11/12 02:17
後置方式を中置方式に変換するアルゴリズムをお願いします。
ツリーつくったら?
58デフォルトの名無しさん:03/11/12 03:50
>>733
0 から 9 までか・・・Cでは厳しい条件だな。
1 から 9 までの間違いじゃないのか?

※以下 1 から 9 までバージョン
#include <stdio.h>
#include <math.h>
#define N 9
void GenKomatiSqNum(int f,int n)
{
 int i;
 if(f==((1<<N)-1)) {
  i=(int)sqrt(n);
  if(i*i==n) printf("%d = %d^2\n",n,i);
 }
 else for(n*=10,n ++,i=1;i<(1<<N);i<<=1,n++)
  if(!(f&i)) GenKomatiSqNum(f|i,n);
}
int main(void){GenKomatiSqNum(0,0);return 0;}
>>58
誤爆?
私C言語なのですが訊いてよろしいのかしら?
61デフォルトの名無しさん:03/11/12 17:07
パスカルの三角形のログ探してるんだけど、
ここってミラーとか作ってたりする?
>>61
●を買えば見られますよ
63デフォルトの名無しさん:03/11/12 18:59
奇数か偶数か判定するプログラムは、どう書いたらいいのですか。
できるだけ早いプログラムを書いてください。
64デフォルトの名無しさん:03/11/12 19:01
>>63
奇遇判定の対象となるデータの形式による
>>63
宿題は自分でやれ。
66デフォルトの名無しさん:03/11/12 19:17
>>64
int

>>65
宿題じゃないよ。
今、ゲーム作っていてキャラクターを点滅させるのを考えているんだけど
ある値に++;していって、その値が偶数だったら描画する。
というようなプログラムを考えていたんです。
67デフォルトの名無しさん:03/11/12 19:21
1ずつ上げるんじゃなくて2ずつ上げれば。
>>62
えっ●って何?
69デフォルトの名無しさん:03/11/12 19:25
>>66
while(1){
点();
滅();
}
>>66
val&1が0なら偶数、そうでなければ(1なら)奇数
バグが取りやすいプログラムを書くコツなどがあれば
教えて下さい。
72デフォルトの名無しさん:03/11/12 19:55
バッファオーバーフローでroot権限を奪取する方法を教えて
>>71
バグが取りやすい==解りやすい なら
ttp://pc.2ch.net/test/read.cgi/prog/1067874379/l50

>>72
しつけぇよバカ
74デフォルトの名無しさん:03/11/12 20:05
バッファオーバーフローでroot権限を奪取する方法を教えて
75デフォルトの名無しさん:03/11/12 20:23
76デフォルトの名無しさん:03/11/12 20:43
>>71
構造化プログラミング
オブジェクト指向プログラミング
79名無しさん:03/11/12 21:38
C言語では、条件演算子はどのように書くとよろしいのでしょうか?
C++では、
a > 0 ? b=1: b=2;
のように書いていました
80デフォルトの名無しさん:03/11/12 21:39
>>79
(a > 0) ?( b=1):( b=2);
>>79
それでいいんだが。
ダメだったのか?
82デフォルトの名無しさん:03/11/12 21:40
価格破壊! 無修正DVDがなんと1枚1,000!

★★★無修正DVDの老舗★★★ ★★★復活★★★



ペントハウス10月号で徹底検証 ★加藤iの★ 全裸盗撮DVD鮮明画像原版入荷
新宿歌舞伎町店頭価格10,000円の品 他商品と同価格 
   商品映像確認後の★完全アト払い★ ダマしよう無し

同時入荷  ★朝河 蘭 新作  ★D-MODE20 白石ひより  
      ★援交ハメ撮り 品薄入手困難なNo.3・5・8
      ★女子高生拉致監禁飼育シリーズ 小雪・桃井望 
  
http://adult.csx.jp/~e-legal/index2.htm

     及川奈央 堤さやか 長瀬愛 も依然バカ売れ
 サンプル画像充実 日本一安い、安心、確実。歌舞伎町店頭販売10年の
 実績と信用と★検挙回数★の多さ?  ご覧下さい。 ★★★自信有ります。★★★
            
http://adult.csx.jp/~e-legal/index2.htm


むしろこうだな
b=a>0:1:2;
しうせー
b=a>0?1:2;
8579:03/11/12 21:45
>>81
ハルヒコのC++入門本では、
a > 0 ? b=1: b=2;  これは誤り
と書いていました
86デフォルトの名無しさん:03/11/12 21:48
>>85
誤りとしか書いていないのか?
正しい例は書かれていないのか?
87デフォルトの名無しさん:03/11/12 21:53
a > 0 ? (b=1): (b=2);
ってことか? >>85
88デフォルトの名無しさん:03/11/12 21:55
じゃねえ
a > 0 ? (b=1): b=2;
89デフォルトの名無しさん:03/11/12 21:59
>>88
>>87が正解みたい
代入先が同じなら>>84と書くべきだと思うけど
90デフォルトの名無しさん:03/11/12 22:02
a > 0 ? b=1: b=2;
C++だとOKでCだと駄目みたい
91 ◆3VUXqvbfSY :03/11/12 22:37
#include<stdio.h>
#include<stdlib.h>

main()
{
char str[100];

int num;

gets(str);

num = atoi(str);

printf("%d\n",num*10);

}




コンパイルエラーが出ます。何故?
92デフォルトの名無しさん:03/11/12 22:43
出来るだろ
エラーじゃなくてgetsは危ないという警告では。
あとreturnがないとか。
94デフォルトの名無しさん:03/11/12 23:04
>>91
リッチテキスト形式で保存しただろ
>>91
OS,処理系、エラー内容を書かないやつは来るな。
96 ◆3VUXqvbfSY :03/11/12 23:08
アヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャ
>91-96
可愛そうな奴だな
#include<stdio.h>

void hai(int a[][]);
int main(void)
{


int a[3][3]={{1,2,3},
{4,5,6},
{7,8,9}};

hai(a);
}

void hai(int a[][])
{int x,y;
for(y=0;y<3;y++){
for(x=0;x<3;x++){
printf("%d ",a[y][x]);
}
printf("\n");
}
}

多次元配列を関数に渡したいんですが、どのようにすると良いでしょうか?
FAQ
int a[][3]
 or
int *a, size_t span
10299:03/11/13 00:12
>>100
FAQでした。逝ってきます。
10399:03/11/13 00:14
>>101
ありがとうございます。
参考にさせていただきます。
104 ◆g/ZMVdytmo :03/11/13 00:18
#include
>>95
初心者は帰れ。
>>105
空気嫁ないやつはカエレ
107デフォルトの名無しさん:03/11/13 00:31
>>579
問題の対象の実装方法や大きさにもよるが、一番汎用的で高速な方法は、
まず日付の差を計算する関数と、指定された日付の範囲のレコードを
休日テーブルから拾い出す関数を用意して、

実稼動日数 = 終了日 - 開始日 - 開始日から終了日の間の休日の数 + 1

で出せばいいんじゃないの?
>>107
誤爆カコイイ
109デフォルトの名無しさん:03/11/13 00:43
宿題をやってくれるスレはここですか?
110デフォルトの名無しさん:03/11/13 00:46
違います
111デフォルトの名無しさん:03/11/13 00:49
どこですか?
質問ですが、いちいちコンパイルせずに
コンソール上でa.txtやb.txtのファイルを指定して読み込ませるようにするにはどうすればいいのでしょうか
borlandつかってます
if(NULL==(fp=fopen("a.txt","r"))){
   printf("erroer");
exit(1);
}
i=0;
while(fscanf(fp,"%d",&a[i])!=EOF){
i++;
}
fclose(fdata);

if(NULL==(fp=fopen("b.txt","r"))){
   printf("erroer");
exit(1);
}
i=0;
while(fscanf(fp,"%d",&b[i])!=EOF)
{
i++;
}
fclose(fp);
>>112
コマンドライン引数
>>112
int main(int argc, char** argv)
115デフォルトの名無しさん:03/11/13 00:55
C言語プログラミングって俺みたいな64歳のジジイがやり始めても大丈夫ですか?
>>115
何歳でもやる気があれば問題なし。

生涯学習カコイイ
erroerってエロイな
118112:03/11/13 01:01
>>117
糞レスしてんじゃねーよヴォケ
>>118
逆切れカコワルイ
120112:03/11/13 01:09
>>118
騙るなよw
つか使い方がよく分からん・・
コマンドライン引数でぐぐれ
Windowsから使い出すと、
コマンドライン引数やリダイレクトやらも知らないヤシになるんだろうか?

プログラマなら使う機会ありそうなのに…。
>>122
Windowsからでも、ある程度使ってると身につく。
フリーソフトなんかでもよく使われるし、再インストとかなんだかんだ言ってDOSの知識も要る。
コンソールなんて言葉を使うような頃には当然そういう知識は身に付いてるもんだけど・・・。
授業とかだと無理やり言語周りだけやるからそういうところはすっぽかされるかもしれん。
コンパイラが欲しいのですが、2のどこをおとしたら良いのかわかりません。
125学生:03/11/13 18:58
>>112

int main(int *argc, char *argv[]) /* (引数の数, 引数の文字列(?)) */
{

/* 引数が3以外の場合はプログラム終了させる */
if(argc != 3)
{
printf("使い方 : <プログラム名> <ファイル1> <ファイル2>");
exit(1);
}

/* 2つ目の引数で指定されたファイルを開く */
if(NULL == (fp =fopen(argv[1], "r"))){
printf("erroer");
exit(1);
}
i=0;
while(fscanf(fp,"%d",&a[i])!=EOF){
i++;
}
fclose(fdata);

/* 3つ目の引数で指定されたファイルを開く */
if(NULL == (fp = fopen(argv[2], "r"))){
printf("erroer");
exit(1);
}
126学生:03/11/13 18:59
>>112
実行法は例えば 

プログラム名が command.exe
ファイル1が a.txt
ファイル2が b.txt

だったら

>command a.txt b.txt

です
127学生:03/11/13 19:00
>>124
使用しているOSを教えてください
128デフォルトの名無しさん:03/11/13 19:16
すいません
externの有用性を教えてください
ヘッダファイルに定義を書いておくのと何が違うのでしょうか?
ヘッダに定義を書いた場合、そのヘッダを幾つかの処理単位から
呼び出していたりすると、リンカが多重定義だとか文句を言うわけで。
特に変数は省略すると定義かつ宣言になるから、externで宣言だけ
だと明示しないとね。
お目ーラオ地こぼれ
131デフォルトの名無しさん:03/11/13 19:44
>>129
ありがとうございます
変数に使えるんですか。変数に対してなら納得です。
実は僕の頭の中では関数に対して使うものだと思っていました。
「幾つかの処理単位」というのがどういったものかわからないのですが
そういう多重定義などは
#ifndef-#define-#endifのブロックで囲んでしまうというやり方はどうですか?
僕は関数の場合はexternを使用しないで#ifndef-#define-#endifを使っています
というか、自分で書いたヘッダファイルは全て#ifndef-#define-#endifを書いてます
>>131
129ではないが、
> そういう多重定義などは
> #ifndef-#define-#endifのブロックで囲んでしまうというやり方はどうですか?

これではコンパイル単位にまたがった多重定義が防げない。
当たり前だが、#defineのスコープはコンパイル単位(cファイル単位)なので。
>>132
ノー
行末か#undefまで
134129:03/11/13 20:00
>>132
激しく、顔を洗って出直しの予感がします・・・すいません。

>、#defineのスコープはコンパイル単位
じゃあ例えば、abc.c def.c xyz.h(#ifndef-#define-#endifを書いている)の3つのファイルがあって
2つのcソースファイルはxyz.hをインクルードしており
これを、一括でコンパイルする時はOKだけど
最初にabc.cだけコンパイルし後からdef.cをコンパイルする時はダメということですか?

やっぱ基本的な理解がわかっていないようです
Cでは関数の引数にデフォルト値って指定できない?
136133:03/11/13 20:01
行末じゃなくてファイルの末尾
>>135
無理
>>134
> これを、一括でコンパイルする時はOKだけど
> 最初にabc.cだけコンパイルし後からdef.cをコンパイルする時はダメということですか?

一括でコンパイルしようが別々にコンパイルしようが、abc.cとdef.cは別のコンパイル単位
になる。つまりどちらも駄目。
>>133
フォローサンクス。
俺今好きな人がいるんですが、好きな人を振りかえらせるプログラムはC言語が一番最適ですか?
いきなりCをするのはどうかと思うぞ
>>125のmainの第1引数が int *argc になってるのは無視ですか。そうですか。
143129:03/11/13 21:41
>>138
どうもわからない・・・
例えばstdio.hって頻繁に使用されてますが
abc.cとdef.cの2つで#include <stdio.h>していてもエラーになりませんが
これは、全てextern宣言してあるからなのですか?
全てそうなっていなかったと思うんですが
お前129なんか?
>>143
stdio.hの中身を読んだこと無いの?
>>143
もしかしてint func(int,double);とextern int func(int,double);が同じものだということを知らない?
147129 ◆o1ctRqdEBo :03/11/13 22:16
>>144
そうです
>>145
今見ました。externは一個も書いてませんでした。(stdio.hにincludeされているファイルまで見てませんが)
しかし、ヘッダの中身なんて他の環境の場合変わる場合あるしわからんけど

>>146
そういうことを言ってるではないんです
129なんだ・・・
>>147
> 今見ました。externは一個も書いてませんでした。
念のため聞くが、グローバル変数の定義はあったんだろうな?
150128 ◆o1ctRqdEBo :03/11/13 22:24
すいませんマジで勘違いしました
128です
インクルードガードは構造体定義などの型定義があるときに同じ名前の型が多重定義になるのを防ぐために使う。

関数の前宣言はいくらあっても別に構わない。
152128 ◆o1ctRqdEBo :03/11/13 22:27
すいませんが
話がずれてきているような・・・

128-129-131-132-134-138-143の流れで進んできました

153128 ◆o1ctRqdEBo :03/11/13 22:28
>>151
ありがとうございます
その答えが欲しかったのです
手元にあったSHCのstdio.hから抜粋。

extern const int _nfiles;
extern struct _iobuf {
unsigned char *_bufptr; /* buffer pointer */
long _bufcnt; /* buffer count */
unsigned char *_bufbase; /* buffer base pointer */
long _buflen; /* buffer length */
char _ioflag1; /* I/O control flag 1 */
char _ioflag2; /* I/O control flag 2 */
char _iofd;
} _iob[];

#ifndef _REENTRANT
extern volatile int _errno;
#else
extern int *errno_addr(void);
#define _errno (*errno_addr())
#endif
155128 ◆o1ctRqdEBo :03/11/13 22:31
>>154
環境によって同じ名前のヘッダでも中身違うので意味ないです
>>128がなにを聞きたかったのかさっぱり分からんが、
とりあえず>>151は神。
errno.hにあるextern int errno;はどんな環境でもあるはずだが。
158128 ◆o1ctRqdEBo :03/11/13 22:39
なんか俺、分裂症だ死にたい
>>158
ファイルごとに定義するよりも、どこか一箇所で定義して他のファイルからはそれを参照する形にした方がいいと思わない?
160128 ◆o1ctRqdEBo :03/11/13 22:45
>>159
僕の場合(関数の話です)

ある関数をまとめたCのソースファイルfunc.cがあるとして
そこに定義を書いておいて
宣言をfunc.hというヘッダファイルに書いています
でメインのソースファイルmain.cで#include "func.h"としているんですが・・・なんかへんですかね?

>>160
言い忘れたけど、グローバル変数の話。
162128 ◆o1ctRqdEBo :03/11/13 22:51
わかりました
>162
ちょっと「関数の定義」と「関数の宣言」の違いを語ってもらおうか。
そのうえで、自分が128で何を書いたのか、もう一度読み直してみろ。
164128 ◆o1ctRqdEBo :03/11/13 23:10
宣言:int func();

定義:int func(){ return 0;}

こういう風に理解していますが
↑のレスで書き間違えている場所があったのでしょうか?

もともと僕のいいたいことは、関数にexternつける場合ってどういうときですか?ということが聞きたかったのです。
int func(void);
166デフォルトの名無しさん:03/11/13 23:15
外部からも呼ばれることを明示するためじゃないの。俺はつけないけど。
関数宣言のexternは、変数のautoと同じで、意味は変わらない。
「強調したいとき」にでもつければいいんでねーの。

128で、ヘッダファイルにおいて、「extern(で宣言する)」と「定義を書いておく」を対比させたり、
131で、(ヘッダで定義を置いても)インクルードガードで囲めば多重定義は解決できるか、とか
聞いたのは一体どういう理由があるのかね?
168128 ◆o1ctRqdEBo :03/11/13 23:20
>>166
この、明示っていうのがホントに必要なのかなと思ったわけです(関数の場合)
C言語ってファイル間で別に何も指定しなければ自由に呼び出せると解釈しています。
確実に必要な場合があるならその例が知りたいです(関数の場合)
>>168
>>167が実にいいこと言っている。long int a;のintやsigned int a;のsignedと同じ。
170爾来:03/11/13 23:23
どうでもいいけどNULL==(fopen(...とかいう間抜けなことはやめようね。
>>168
int func(void)とあったら、その前にはexternかstaticがつくんだけど省略すればデフォルトのexternをつけたとみなされる。
だからexternなら書く必要はない。
>>170
fopenを前に持ってきても==を=と書き間違えればエラーになるから間抜けでしかないねぇ
173128 ◆o1ctRqdEBo :03/11/13 23:31
>>167
>128で、ヘッダファイルにおいて、「extern(で宣言する)」と「定義を書いておく」を対比させたり、
最初に『ヘッダファイルに定義』ではなく『ヘッダファイルに宣言』の間違いでしたすいません。

externは「他のファイルやブロックで定義されているものを参照可能にする」
ヘッダファイルに書く方法ではincludeしてそこに宣言が展開される(定義は他のファイルですが)
出来たファイルは同じ意味のものになるので対比させ、externは意味はないのではないかと思った。


>131で、(ヘッダで定義を置いても)インクルードガードで囲めば多重定義は解決できるか、とか
>聞いたのは一体どういう理由があるのかね?

これは129に対する答えで書いたものです
しかし、先ほど書いたように128の中の文は
『ヘッダファイルに定義』ではなく『ヘッダファイルに宣言』の間違いでした
なので混乱させてしまいましたすいません
174デフォルトの名無しさん:03/11/14 00:32
もし、誰かこの意味が教えて下さい。
#include <stdio.h>

int main ( void )
{
int a [2][3];

printf ( "%p\n", a );
printf ( "%p\n", *a );

return 0;
}
とすると、同じ値が返されます。
*間接演算子はアドレスの示す先の値を返すとおもっていたのですが、配列の場合は違うのでしょうか?
175デフォルトの名無しさん:03/11/14 00:35
>>174
二次元配列は配列の配列だから。
配列の先頭アドレスと最初の要素のアドレスは当然ながら一緒。
こんな感じかな?
*a == a[0] == &a[0][0]
それと意味不明な言葉を書かない程度に落ち着け。
177デフォルトの名無しさん:03/11/14 00:51
標準入力から数値を入力して素数かどうか判定するプログラム。
だれかつくってくれ。
おまえが作ればよいではないか
179デフォルトの名無しさん:03/11/14 00:55
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
よしきた! まず数値が素数かどうか判定する関数をくれ!
181177:03/11/14 00:57
宿題じゃねーって。
ハッシュ表のサイズ決めるのに知りたいだけだからだれか作ってくれよう。
そんなことも分からない人がハッシュ?笑わせるな。
>>181
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐>知っているがlト、 /   〃ゝ、
   〈、ネ .お前の    .lF V=="/ イl.
   ト | 態度が    とニヽ二/  l
   ヽ.|l.気に入らない〈ー-   ! `ヽ.  
      |l.         lトニ、_ノ    ヾ、
      |l__________l|   \    ソ
184ビル・ジョブス:03/11/14 01:03
話しそれますが、
グローバル変数へのexternをヘッダーファイルに書く人はまだまだ素人だね。
そもそもグローバル変数なんてAPIを提供すれば基本的には不要な物。
それでも必要なシーンはごく限られた場合にあるからソース内でexternしてね。
ヘッダーファイルで#ifdefとかで実体の宣言とexternを切り分けてる人は本当のおバカさん。
横着して#ifdefなんか使わずに、staticで宣言してAPI提供しましょうね。
情報の”公開と隠蔽”を常に意識してコーディングしましょうね。
ビル、久しぶり。
関数で提供しろってのは同意だが、extern宣言をソースごとに書かせるのは馬鹿。
宣言をヘッダ内に入れることで、正確な型や宣言方法を共有することが出来るのに、各ソースに分散させたら修正効かなくなるぞ。

APIの意味についても勉強しなおした方がいいぞ。
186ビル・ジョブス:03/11/14 01:13
>>185
釣れた(藁
187ビル・ジョブス:03/11/14 01:24
>>186
184は本物だよ。理由は184==おれだから。

>>185
そんなにグローバル変数をたくさん使うシーンってありえないと思うのだが・・・?
たくさん使うならなおさら全てAPI化するべきだ。
念のために言っておくが68系のI/Oポートは変数じゃないぞ。
>>187
APIという言葉の意味について勉強しろって
つか、APIでくくるな
189は187へのレスね
191ビル・ジョブス:03/11/14 01:28
>>188
一方的にそう言われても・・・”メソッド”って言葉を使えって意味か?
すまん・・分からないから教えてくれ。
192ビル・ジョブス:03/11/14 01:30
あ!分かった!
”関数”って言えば文句無いのか?
>>192
正解!

で、APIでは何故ダメなのか理解できたのか?
194デフォルトの名無しさん:03/11/14 01:35
たとえば
Xを10で割った余りYを求めるときって
Y=X%10 でいいんですか?
195デフォルトの名無しさん:03/11/14 01:41
>>194
試せばわかるでしょ?
196ビル・ジョブス:03/11/14 01:44
”API”という言葉の定義についてはプラットフォームや言語によって解釈が別れる
と考えているのでここでの名言は控えるが、おれの感覚では外部公開メソッドはAPI
と呼んで差し支えないと思っているよ。
いいですよ
>>194
ここは幼稚園か?
あるソフト(例えばOS)の機能を他のプログラムから呼び出せるようにしたものじゃないの?>API
>>196
ということはstrlenもAPI?
APIは何の略なのかと小一時間
202194:03/11/14 01:52
「いやC言語なら俺に聞け!」っつースレじゃねーの?
単なるヲタの馴れ合いスレじゃん
少なくともWindowsでstrlenと同等の機能を持つlstrlenというのは
"API"の中に含まれているな。

システムコールを呼び出すものだけがAPIってわけではなさそうだ。
>>202
そうだよ。俺に聞けだよ。
だからといって答えるとは限らないよ。
205194:03/11/14 01:57
ヲタってのは言い過ぎたなスマソ
自分で試してみますよ
206ビル・ジョブス:03/11/14 01:57
>>200
それは言語仕様の一部だからちょっと違う位置付けにあたると考えるけど、
ある意味そうじゃないか?所詮プラットフォーム依存する話だから、
もうちょっと冷静に頭を柔らかくして考えましょう。
207デフォルトの名無しさん:03/11/14 01:58
>>176
間接演算子って変数値の示すアドレスに格納されている値を得る為の演算子だと習ったんです。
でも、試しにプログラムを作るとそれが成り立たなくてこまっているんです。
つまり、
*a
とすれば、aの値をアドレスとして、そのアドレスの中にはいっている値が返ってくると思ったんだけど、
a,*aが同じだとするとなんかおかしい。
可能性としてaの中にaが格納されているアドレスが格納されているのかとも思ったけど、そんなことは
事実上なさそう。
だから、もしかしたら配列には間接演算子の意味が違うのかなと思ったんです。

数値が素数かどうかはこのようにする。
int isPrimeNumber ( const int num ) {
int tmp,i;
i = 2,tmp = num;
while ( tmp > i ) {
if ( !(num % i ) ) return 1;
tmp = (int)(num/i), i++;
}
return 0;
}
>>207
175は無視か?
配列の配列だからだと言っているだろ。
int a[10][10];なら*aと間接参照すれば出てくるものはint[10]という配列だ。
それを評価するということは・・・分かるだろ?
一次元ではなくわざわざ二次元でやっているあたりネタかな。
>>206
http://pc2.2ch.net/test/read.cgi/tech/1068628392/
このタイトルが似合っているね・・・
>>206
APIは関数とは限らない、という話。
212デフォルトの名無しさん:03/11/14 02:37
>>208
だから、間接演算子って変数の中に含まれる値のアドレスに格納されている値でしょ。
だからaと*aが同じなのはおかしいと言っているの。(ポインタのときは正にその通りになる)
aの値が0x00001111なら、*aは0x00001111というアドレスに格納されている値が返される
のに配列の場合は違うので、その説明がほしいんです。
ちなみに、以下のプログラムを実行すると*aと*bで違う値がはいって来ます。*bは常に0x5となる。
(なぜかセグメントエラーがでますが。)
int a[1][1];
int **b;
a[0][0]=5,a[0][1]=6,a[1][0]=7,a[1][1]=8;
b=(int **)a;
printf ( "%p\n", a );
printf ( "%p\n", b );
printf ( "%p\n", *a );
printf ( "%p\n", *b);
>>212
配列は式中で先頭要素を指すconstポインタに格下げになるから(sizeof等以外)
b=a;とやってエラーになったからキャストしたんだな(藁
int (*b)[1];
b=a;
エラーじゃなくて警告か
>>212
> 格納されている値

だからその値ってのが配列(一次元の)だっての。
>>212
お前が求めているのは*aじゃなくて**aじゃねーの?
>>212
> printf ( "%p\n", a );
"配列"を "%p" で表示している時点で気付かないのか馬鹿チン。
>>212
int main ( void )
{
int a [3];
printf ( "%p\n", &a );
printf ( "%p\n", a );
return 0;
}

この結果は>>175と同じ意味になるのはわかる?
配列に&演算子を適用しても同じアドレスになるでしょ(型は違う)。
配列でなければ、こうはならないよね?

>>175は*で参照した先が「配列のアドレス」という「定数」であるだけで
示した先が「配列の配列」から「配列」に変わっている(ちゃんと間接参照している)。
>>218が指摘している通り、>>213が言っていることを知らなかったわけじゃなさそうなんだよなぁ。
221デフォルトの名無しさん:03/11/14 02:57
>>214
b=a;
とやってもコンパイル時にwarningがでるだけです。(Linux gcc-3.2.2-5)
コンパイルできて、実行も出来ます。
int (*b)[1]でいいということは、
二次元配列を示すaという変数?は一次元配列へのポインタとほぼ同じと言うこと?
>>220
どうやら知らなかったようだぞ
おやつ食べよ
俺も
うんこしてくる
226初心者:03/11/14 05:38
char型配列をfreadで読み込んだもの同士に排他的論理和をとりたいんですが 、
「^」を使うと「invalid operands to binary ^」とエラーが出てしまいます。
使い方が間違っているのは分かったんですが、どのようにすればよいでしょうか?

---------以下ソース------------
char buf1[], buf2[], eor[];

int ret1 = fread(buf1, 1, 128, fp);
int ret2 = fread(buf2, 1, 128, fp);
eor = buf1 ^ buf2; //←こいつでエラー
CのCはコンパイルのCをももじったと聞きましたが本当ですか?
228デフォルトの名無しさん:03/11/14 05:41
>>226
配列の個々の要素に対してやらないと駄目でしょ。

for(i=0;i<128;i++)
eor[i]=buf1[i]^buf2[i];
int c;
char *buf1, *buf2, *eor;
for (c = 0; buf1[c] && buf2[c]; c++)
  eor[c] = buf1[c] ^ buf2[c];

かなぁ

うまく説明を読み取れてなければごめんよ
230初心者:03/11/14 05:42
>226に自己レスですが、fpには
fp = fopen("test.wav", "r+b");
で、wav形式の音声ファイルを読み込ませてます。
> eor = buf1 ^ buf2;
以外のところではエラーはないのでこいつだけが問題です。
宜しくお願いします。
231初心者:03/11/14 05:44
>228-229
更新してなかったので見えてませんでした。
レスありがとうございます。
今から試してみます。
buf1 ^ buf2;は何を得たいのかがわからない。
ソコをしっかり書いてみて、もしかしたら自分で解るかもよ
233初心者:03/11/14 05:56
>228-229
言われた通り個々の要素に対してやったらうまくいきました。
ありがとうございました。
よかったね。
で、何でこんな事になったかはわかった?
配列や文字列のコピーも似たようなものだね。
配列と文字列は一緒だと突っ込んだらだめ?
で配列のコピーはもうループしかないのでは?と思うけど
>>236
あ、俺は>>233じゃないよ。

> 配列と文字列は一緒だと
うん。分かっている。

> で配列のコピーはもうループしかないのでは?
うん。int a[10],b[10]としたとき、a=bと直感的にコピーできないのが似ていると言ったの。
あ〜、うん。違う人だとはわかったよ。口調でね

直感的にa=b無理だけど、コッチの場合は両方の数字があってるから
memcpy (a, b, sizeof a * sizeof int)

でいけそうだね
って、話してる議論が全然違ったのに今気が付いた。

配列とかにはCって融通が利かないよねぇ。。。
文字列を扱うときってすごい面倒くさいしね
ソコがCの弱点だね
K&Rの冒頭に「文字列のコピーも関数を呼ばないといけないんだって!」と書かれていたね。
そういうことまでライブラリにまかせるから文法がコンパクトなんだよね。
__cdeclってどういう意味ですか?
調べてもわからなかったのでよろしくお願いします。
ごめん…CプログラマのバイブルK&Rを読んだこと無いです

代わりといってはナンですが、ω社のC言語によるプログラミングという本を読みました。
まぁ、とても解りやすいと思いましたよ。

読んでて、なるほどって思いますよ。
覚えやすい本と覚えにくい本ってありますよね。

ちなみに独習C++は最低でした。
ぜんっぜん相性がよくなかったです。
>>241
パスカル関数よぶんだっけ?
245初心者:03/11/14 06:55
>>234
>で、何でこんな事になったかはわかった?
配列の扱いがまだよく分かってないのですが
配列の中身を一括で処理できない事はわかりました。

>>236
> 配列と文字列は一緒だと突っ込んだらだめ?
んー意味がまだよく分かりません。
もう少し勉強してみます。

みなさんありがとうございました。
また宜しくお願いします。
>>245
>>236>>235に対するものだぞ(笑) 理解することにこしたことはないけど。
そうだね。

ちなみに配列=ポインタだから

int *p;
p == p[0];

ちなみに、漏れが読んだω社の奴は結構わかりやすく書いてあって、これよめばOKだと思う
ただ、#pragma とかの使い方かいてなかったりと内部へまで踏み込んでない部分が少しマズかったかと思う
ちなみに漏れは第2版で今は3版があったと思うからちょっと見てみるといいよ
>>247
*p==p[0]

#pragmaは処理系によって内容が異なるから載っていなくて当然じゃない?(C99準拠なら標準の命令は載せるべきだけど)
それとも#pragmaという言葉自体が出てこないの?
>>248
*p == p[0]
そうですね、間違えました^^;

自分が読み損ねたのかもしれないけど、まったく記憶にないですねぇ>pragma
と思って索引を引いてみましたが pragma は無かったです。変でしょうかねぇ?
でも内容は充実してるので、一度ω社の本見てみてください^−^
#pragmaについての記述がないなら問題だ・・・
問題ですねぇ・・・
自分なんかはDirectXプログラミング入門ページに#pragma comment(lib, "xx.lib")なんて会ったからよかったです。
(ちなみに他の使い方は本当に知りません
252デフォルトの名無しさん:03/11/14 10:18
#いんcぅで <stぢお。h>

いんt まいん(う゛ぉいd){
pりんtf(”へっぉ、 をrld¥ん”);
れつrn 0;
>>250
C99 以前だと、#pragma の内容は完全に環境依存なんだから
いいんじゃない?
>>253
>>248 >>249 >>250 と読んでいってその意見なら間抜けだな。
ちゃんと読んでないなら、やっぱり間抜けだな。
255デフォルトの名無しさん:03/11/14 15:14
16進数に対応する文字を入力したら10進数に対応する文字を表示するにはどうしたらいいですか?
>>254
そんなもの載せる必要などない、と言ってるんだが。
>>255
正しい日本語で書いて下さい。
>>255
scanfでうけてprintfで表示するのがいいと思います。
>>255
#include <stdio.h>
#include <ctype.h>

int main( void )
{
  int ch;

  /* 一文字入力 */
  ch = getchar();

  if( isxdigit(ch) ) /* 16進数文字か? */
  {
    /* 10進数に対応する文字を表示 */
    puts( "0123456789" );
  }
  return 0;
}
260デフォルトの名無しさん:03/11/14 15:52
>>257
//つまりだな

#include <stdio.h>
char x[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int cv(char c){
int i;
for(i=0;i<16;i++){
if(x[i]==c)return i;}return 0;}
//ってやっておいてだな
int main(){
char *input="abcd";
//何らかの方法でストリームから入力するだろ
//でもって
int result=0;
while(*input!='\0'){
result=result*16+cv(*input);
input++;
}
printf("%d",result);
getc(stdin);
return 0;
}
これ以外のいい方法ないかってきいてんの




>>260
16進数文字列を数値に変換したいのか?

それなら、sscanf()やstrtod()とか便利な標準関数があるだろ。
262258:03/11/14 16:02
>>260
つまりだな、

#include <stdio.h>

int main(void)
{
    int x;
    scanf("%x", &x);
    printf("%d", x);
    return 0;
}

これじゃだめなんかって言ってんの
>>260 (255)
strtolとprintf
264261:03/11/14 16:05
>>260
言い忘れたが、そのソースでは何をやりたいのか理解に苦しむぞ。
脳内補完をフル稼働して解析したが、
アホな事をやっているので解読が困難だったぞ。ゴルァ!
265261:03/11/14 16:07
>>261
×strtod()
○strtol()

逝ってくるよ…
266デフォルトの名無しさん:03/11/14 16:08
いやつまりだな
「16進数を表す文字」を「10進数」で表示(表示は文字でも整数でも可)したいわけよ
>>266
表示は何らかの形で文字列に変換しなければ表示出来ない訳だが
>>260
>>261 (>>265) も言ってるが、strtol() だな。

  char *tp;
  result = strtol(input, &tp, 16);
269デフォルトの名無しさん:03/11/14 16:12
>>264
この程度で「解析」かよ おおげさだなぁ
アホなことって・・・strtol()も同じじゃないか?
270デフォルトの名無しさん:03/11/14 16:13
すいません
strtolの場合0xつけないとダメですね?
271261:03/11/14 16:14
>>269
わざと大げさに言ってる訳だが(ry
272デフォルトの名無しさん:03/11/14 16:16
>>267
ちゃうて
printf("%d",x_int);
printf("%s",x_chars);
どっちでもいいよってことよ
>>269
アホな事ってのは「登山道を使わず、態々裏から岩壁を登る」事を
言っているのだと推察。
岩壁を登るのが目的なら、それはそれでいいんだが。

>>270
16進だと指定したときは、いらない。
キーウェイトの処理ってどうやって入れるんですか?
275デフォルトの名無しさん:03/11/14 16:34
>>274
gets(stdin);
じゃだめ?
276デフォルトの名無しさん:03/11/14 16:34
いや、これか?
getc(stdin);
何でgetcharって書かないの?
>>270
いいや。第3パラメータを16にすれば、いらないよ。
>>277
大げさだがオブジェクト指向的に考えると
getchar()は俺は書きたくない
getc(FILE *stream)
を使って関数を書いておけば

int func(FILE *strem){
//なんか処理
int c;
c=getc(stream);
//なんか処理
return (0);
}

この関数の引数には
stdinでもFILE*でも渡せることになる

まあ、今回のケースではそんな必要は涙そうそうだけど
                         ̄ ̄↑ ̄
                         笑うところ
>笑うところ
( ´Д`)ハァ?
>>280
その顔は笑ってるよな
282デフォルトの名無しさん:03/11/14 17:34
>>279
>大げさだがオブジェクト指向的に考えると
         ̄ ̄ ̄ ̄↑ ̄ ̄ ̄
           笑うところ
くそう、バカにしやがって・・・
自爆してやる

>>279←笑うところ
(゚Д゚)≡゚д゚)、カァー ペッ!!
>>284
誰だよお前
オレオレ、オレだよ
いや、オレオレ
>>286
うちには孫はいないよ!じじばば舐めんなよ!
お兄ちゃん、わたしわたし。
>>289
あ、なんか微妙に新しい雰囲気でこれって使える?(他の人の反応待ち
「お兄ちゃん、わたしわたし詐欺」行員が撃退
秋銀十文字支店 2人に感謝状

  妹を装って電話をかけ、金をだまし取る「お兄ちゃん、わたしわたし詐欺」が県内でも相次ぐ中、
 被害を未然に防いだ秋田銀行十文字支店の行員二人に二十六日、増田署の
 五十嵐孝明署長から感謝状が贈られた。
  お手柄の二人は、支店長代理の佐藤文雄さん(36)と、窓口係の加納静子さん(42)。

  事件が起きたのは十三日昼。十文字町内の無職ひきこもり男性(32)が同支店を訪れ、
 「すぐに七十万円を振り込まねば」と血相を変えて、窓口にいた加納さんに訴えた。

  ひきこもり男性は「さっき実在しない妹から電話があり、交通事故に遭ったから午後一時までに
 お金を振り込めと言われた」と説明した。

  電話の内容を不審に思った加納さんは、佐藤さんに報告。佐藤さんは同署に通報し、
 「だまされてもいいからお金を送らねば」と話すひきこもり男性を説得。
 送金前に妹が実在するか確認したところ、いないことがわかった。
 加納さんは「詐欺事件の話は耳にしていた。未然に防げてよかった」と話している。
>>291
うけたw

実在しないって本人が言ってるのに、いないことがわかりってかなりありえないw
>>292
ようやく受けてくれたか・・・
あんだけ恥じ晒して笑いの一つも取れないようじゃ
今夜眠れないところだった
>>293
その一言を聞いて初めてわかったよ(笑

ちなみに最初に釣られてた人とは別で
お兄ちゃん、わたしたわし。が初めて見た最新レスです・・・あしからず
>>294

どうでもいいけどお前も笑って欲しいのか?
>お兄ちゃん、わたしたわし。
              ̄↑ ̄
どうしたってんだ…
このスレ始まって以来の面白さだ…
つうか、C言語スレの人ってまじめな人が多いのかしれないが
俺がボケても大抵は相手してくれない場合が多いのだが
今日は相手してくれる奴が多いみたい
てか、やればできるじゃん君達
>>297
ラウンジのレオナルド並だな
誰よそれ
俺はココと過激な恋愛板と野球板にしか現れません
そろそろ(・∀・)カエレ!!
つかね、C言語C言語ってCまでいったことあんの?
>>301
なんでわかった;;
>>302
ま、まじで?
いいなぁ〜
ところでA・B・Cって何処までいくんだっけ?
>>303
>ところでA・B・Cって何処までいくんだっけ?

いやん
おせーておせーて

教えてクレクレ(ハイ寒い?
>>305
そんな事より教えてくれ
俺と同じような空気を持っているお前は何者なんだ?
こんなくだらないことでも語り合えるお前は一体誰なんだ?
普通に出会いたかったな。
2chだと普通の出会いではないと?

>>306ってラウンジャーでしょ?
308デフォルトの名無しさん:03/11/14 20:13
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃    ∧ ∧___    今 日 は                     ┃
┃   /(*゚ー゚) /\                             ┃
┃ /| ̄∪∪ ̄|\/  こ こ ま で 覚 え ま し た      ┃
┃   |        |/                             ┃
┃     ̄ ̄ ̄ ̄                     2ちゃんねる ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛

┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃    ∧ ∧___    今 日 は                     ┃
┃   /(,,゚д゚) /\                             ┃
┃ /| ̄∪∪ ̄|\/  こ こ ま で 覚 え ま し た ぞ  ┃
┃   |        |/                  ゴルァ!!!       ┃
┃     ̄ ̄ ̄ ̄                     2ちゃんねる ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛

a+bをa + bと書く人はいても、a.b,a->bをa . b,a -> bと書く人はいない。
同様にa[b]をa [b]と、func(a,b)をfunc (a,b)と書く人もいない。
func (a,b) は見た事があるな。
>>310の言いたいことがわからない

a[b] a [b]と
func (a,b)の関係が理解しがたい。

ぜひ教えてください
>>312
スペースのつぶれないブラウザで見ろ
ソースの書き方にこだわる心の狭い人なんだな
自動整形通せばいいだけだろー
>>314
誰がこだわっているって?
OpenJaneだけど。。。
漏れは

a[b]だけど a [b][c]と、二次元配列になるとスペース入れるかもしれない。

func (a,b)のが見やすいと思います
318デフォルトの名無しさん:03/11/14 20:56
>>314
じゃ、ここのソースでも自動整形してろ

http://www.ioccc.org/
http://www.pro.or.jp/~fuji/mybooks/cdiag/
319デフォルトの名無しさん:03/11/15 07:57
朝は人がいないのぉ
320デフォルトの名無しさん:03/11/15 08:17
いるわよ
321デフォルトの名無しさん:03/11/15 08:18
いないねって言うといるよって言ってくれる暖かさ
322デフォルトの名無しさん:03/11/15 08:28
おい、↑3レスも含め最近C言語erも壊れかけてるな
323デフォルトの名無しさん:03/11/15 10:03
挿入法を用いた単語出現順整列なのですが・・・

void insort_number(Tree* a,int n)
{
int i;
int j;
Tree w; /*挿入する値*/

for(i=2;i<=n;i++){
w=a[i];
a[0]=w; /*番兵*/
j=i-1;
while((w->number)<((a[j])->number)){
a[j+1]=a[j];
j--;
}
a[j+1]=w;

}
}

において、for文とwhile文のところでは単語はどのように整列されるの
ですか?
すいませんが、丁寧に教えてください。
324デフォルトの名無しさん:03/11/15 10:14
Treeってなんですか?

325デフォルトの名無しさん:03/11/15 10:18
構造体のtypedef struct NODE* Tree
のTreeです。
326デフォルトの名無しさん:03/11/15 10:36
NODEって標準の構造体なんですか?
struct NODE{
int number;
char c;//単語?
}
ですか?

327デフォルトの名無しさん:03/11/15 10:40
そうです
328デフォルトの名無しさん:03/11/15 10:55
挿入法の動き

各時点で着目している整数をその時点でソートされている部分(下線部)の適切な箇所に挿入する

27 31 15 7 11 9 (ソート前)

27 31 15 7 11 9

27 31 15 7 11 9
 ̄ ̄
15 27 31 7 11 9
 ̄ ̄ ̄ ̄
7 15 27 31 11 9
 ̄ ̄ ̄ ̄ ̄
7 11 15 27 31 9
 ̄ ̄ ̄ ̄ ̄ ̄
7 9 11 15 27 31 (ソート結果)
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
Cで放物運動などの簡単な物理運動のシミュレーションをしてみたいのですが、
どのようにすると可能でしょうか?
>>329
まずは自分のやりたいことをもっと明確に表現しろ。
単に位置や速度が計算できればいいだけなのか?
>>330
具体性に欠け、申し訳ないです。
結果までの過程をグラフや簡単なアニメーションで見ることが出来れば言うことないです。

よろしくお願いします。
332デフォルトの名無しさん:03/11/15 11:04
>>329
関数ポインタ使え。
描画用の関数をつくり、引数としてy=f(x)の関数ポインタを与える。
>>332
描写用関数の作り方を勉強してきます.
ありがとうございました.
334デフォルトの名無しさん:03/11/15 11:34

struct _hoge{
struct hoge *next;
char *buf;
int val;
}hoge;


struct hoge *next; 
これって何を意味しているか分かりますか?
335デフォルトの名無しさん:03/11/15 11:41
>>332
すいませんできたんですが、関数ポインタって言うのはこういうものですか?
Windows VC++6.0です

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
int printbrank(int count){
int i;
for(i=0;i<count;i++)
printf(" ");
}
int draw_COS(double max){
double PI=3.1415926535;
double inc=PI/6.0;
int x=0;
int y;
double rad;
for(rad=0.0;rad<=100*PI;rad+=inc){
y=(int)((1.0+cos(rad))*max);
printbrank(y);printf("*\n");Sleep(50);}return (0);}
int main(){
(&draw_COS)(20.0);//ここがポインタ
return 0;
}
336デフォルトの名無しさん:03/11/15 11:43
>>334
リスト的に使うと考えると
それは、次の要素(hoge構造体のポインタ)です
337デフォルトの名無しさん:03/11/15 11:48
>>334
一応、一応ね、言っとくけど
struct _hoge *next;
   ↑こうね
>>335
&draw_COSは関数のアドレス
関数へのポインタはint(*p)(double);
Cは用語の曖昧さが命取りになりやすい
339デフォルトの名無しさん:03/11/15 13:55
教えてください
ファイルサイズを求めるには
どのようにすればよいですか?
340デフォルトの名無しさん:03/11/15 14:08
>>339
VC++の場合
#include <io.h>
FILE *hoge;
long _filelength(_fileno(hoge));
Google で調べればいくらでも方法は分かるんだけどな。

fpos_t start_pos, end_pos;
fgetpos(fp, &start_pos);
fseek(fp, 0, SEEK_END);
fgetpos(fp, &end_pos);
rewind(fp);

fpos_t size = end_pos - start_pos;
342339:03/11/15 15:21
ありがとうございます
いつも >>341に似た方法で行っていましたが
ひょっとしたら簡単な方法があると思って質問しました
343デフォルトの名無しさん:03/11/15 15:25
>>339

俺(340)は無視かよ 
>>343
何で環境依存の回答して威張ってるんだ?
345デフォルトの名無しさん:03/11/15 15:28
別に威張ってないよ
無視すんなよ
>>345
スレ違い発言は無視するものじゃないか?
>>すれ違い
そこまでいうのかよ・・・
俺は最初に断り書き添えてるぞい
キミ、見苦しいよ。
すみやかに消えたまえ。
>>347
スレ違いは言い過ぎた
礼を言うか否かは339に任せればいいと思っただけだ。
>>348-349
何でそんなにまじめになる?
俺はネタのつもりで書いてるのだ
ああ、おれは昨日もこのスレに出没した変な奴だよ。
たとえば>>283とかは俺だ。
一人で盛り上がってるだけで、傍から見るとゼンゼン面白く無いし
>>342
似た方法って ftell() 使った奴かな。
fgetpos() の方がいい。理由は >>1 から辿れる C FAQ を見てくれ。
>>351
おまえが一人で盛り下がってるだけじゃん
みんなは盛り上がってるよ
354332:03/11/15 17:45
>>335
おれの意図したことと違う。
関数ポインタを出したのは、y=f(x)の部分(335の例ならy=cos(x))の関数ポインタを
使うということ。
こうするとy=f(x)の関数を書き換えるだけで、違うグラフを表示できる。
335だと、関数が変わるとそれにあわせて描画の部分も書き換えなくては
いけないので面倒じゃないかと。
少し違うが、
http://www.gulf.or.jp/~damayan/saru/pointer5.html
を参考に。
ありがとうござます
こういう感じですね
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
int printbrank(int count){
int i;
for(i=0;i<count;i++)
printf(" ");
}
int draw(double (*func)(double rad),double max){//←
double PI=3.1415926535;
double inc=PI/6.0;
int x=0;
int y;
double rad;
for(rad=0.0;rad<=10*PI;rad+=inc){
y=(int)((1.0+(*func)(rad))*max);//←
printbrank(y);printf("*\n");Sleep(50);
}return (0);}
int main(){
puts("cos");
draw(cos,20.0);
puts("sin");
draw(sin,20.0);
getch();
return 0;
}
356332:03/11/15 18:09
だいたいそんな感じ。
ただ、355のdraw()は三角関数以外には使えないので、
直線や放物線にも対応できるように少し工夫したほうが。
グラフにしたいXの最小値、最大値、増加量を引数として渡すとか。

関係ないが、PIはmath.hで定義されてるかも。


357デフォルトの名無しさん:03/11/15 18:59
これたのしぃ
358デフォルトの名無しさん:03/11/15 19:23
/* Source1 */
#include<stdio.h>
#define TRUE 1 #define FALSE 0
#define N 5 #define LIMIT 15

int baggage[] = {7,4,5,6,3}; int check[N] = {0,0,0,0,0}; int total=0;

void load(int k); void empty_set(int s[],int n);

main(){load(0);}

void load(int k)
{
int i;
if(total==LIMIT){
for(i=0;i<N;i++){
if(check[i]==TRUE) printf("%d",baggage[i]);
}
printf("\n");
}
else{
int weight;
for(i=k;i<N;i++){
weight = total + baggage[i];
if(weight<=LIMIT){
total = weight; check[i] = TRUE;
load(i+1); check[i] = FALSE; total = weight - baggage[i] ;
}}}}
359デフォルトの名無しさん:03/11/15 19:24
358
Source1 はどんなことをするプログラムですか?
気持ち悪いプログラムです。
printf("753\n"); printf("456\n");
362デフォルトの名無しさん:03/11/15 19:44
#define TRUE 1 #define FALSE 0
は動かない
>>362
貴方の頭はコンパイラより(ry
364デフォルトの名無しさん:03/11/15 19:58
outf = fopen( "aaa.dat", "w" );
fputc(10,outf);
は、なんで2バイトになるの?
0D0Aって何なのよ〜
>>364
テキストモードだから。
自動的に\n->\r\nの変換が行われてる。
366デフォルトの名無しさん:03/11/15 20:00
outf = fopen( "aaa.dat", "w" );
fputc(11,outf);
だと
0Bになるのよ〜どしてかな〜
はいはい
368365:03/11/15 20:09
_| ̄|○・・・
>>368
釣りなんかキニスンナ!
370364:03/11/15 20:12
368>ごめんなさい そんなつもりじゃ・・・
outf = fopen( "aaa.dat", "wara" );
372デフォルトの名無しさん:03/11/15 20:20
>>363
変に略すな。
なるんだね。マクロは新しいマクロが始まると止まるの?
373364:03/11/15 20:27
>>368 >>372 さん失礼いたしました。
#include <stdio.h>
#include <stdlib.h>

int main( void ){
FILE *outf;

if( (outf = fopen( "aaa.dat", "w" )) == NULL ){
printf("書き込み用ファイルのaaa.datがオープンできません");
getch();
}
fputc(10,outf);
fclose(outf);

return 0;
}
というソースで作成したaaa.datをバイナリエディタで見た場合「0D 0A」に
fputc(10,outf);を
fputc(11,outf);
にした場合「0B」と思い通りの値が出るんです。
(´-`).。oO(なんで372に謝ってるんだろう・・・)
375デフォルトの名無しさん:03/11/15 20:33
>>373
漏れもその経験はある

fopen ("aaa,dat", "wb"))
にすると解消するよ、後はファイルオープンの章で調べると解るかもしれない
>>372
アフォですか?
>>373
0x0aは改行コードだから
378364:03/11/15 20:40
>>375 さん ありがとうございます〜
この一文字の為に一日をつぶしてしまった、自分がなさけない・・・
379364:03/11/15 20:42
>>377
改行コードだったんですか。
わかる人は、わかるんですね・・・
一般にヘッダファイルの関数の定義はどこでされているんでしょうか?
math.hの中身を見たんですが
double sin(double x){
...
}
みたいな物が書いてなくて、
extern double sin __P((double));
としか書いてなかったんですが...

あと、ヘッダファイルを自分で書いてみようと思うのですが書き方がよくわかりません。
どこかにその辺を分かり易く解説しているサイト、ありませんか?
>>380
objとかになってるからな。
ソースが無いコンパイラには無いよ。
>>381
せめてLIBに。
>>380
.o .a .obj .libあたりで検索すると出てくるかも
384380:03/11/15 21:07
>>381
ありがとうございます。
自分で作る時も、オブジェクトファイルを作って、同じ名前で拡張子を.hとしたようなファイルに
呼び出したい関数の戻り値の型,関数名,引数の型なんかを書いておけばそれで使えるんですね?
libとかの方が主流でないか?
>>380
どこかで分割コンパイルの質問してなかった?
>>384
オブジェクトファイルはコンパイルするとできるもの。
あんたの言っているのはヘッダーファイル
388387:03/11/15 21:11
ちと読み間違えた。そういうことか。
普通は「ソースファイルと・・・」というな。
389デフォルトの名無しさん:03/11/15 21:18
数学関数を使うのって何か特別なことしないとだめでしたっけ?
#include <math.h>はしています

後、10^4 で10の4乗って使えないんですか?
10^4は、10 xor 4。
391デフォルトの名無しさん:03/11/15 21:21
>>389
両方ともFAQ

上はおそらくリンカオプションに-lmを加える
下は無理。それは10と4でビットごとの排他的論理和をとることになる。pow関数を使う。
392389:03/11/15 21:25
できました。ありがとうございました
393質問:03/11/15 21:37
長方形の左下隅点(origin)と右上隅点(corner)を読みこんで表示するプログラムを作りたいのですが、
下のプログラムのmain関数教えてくらさい。
#include<stdio.h>

struct point(int x; int y;);
struct rect(struct point origin; struct point corner;);

struct point get_point(void){
sturct point p;
printf("enter x and y:");
scanf("%d %d", &p.x, &p.y);
return p;
}
void put_point(struct point p){
printf("(&d, %d)\n",p.x, p.y);
}
struct rect get_rect(void){
struct rect r;
r.origin = get_point();
r.corner = get_point();
return r;
}
main(){
******
}


>>393
大丈夫、そこまで作ったのならお前にだって出来る
395380:03/11/15 21:40
>>386
それは別の方のようです。
C言語スレで質問するのは今回が初めてですし。
397質問:03/11/15 21:50
>>394
できません;・(ノД`);・。

おながいしま
398794:03/11/15 22:02
脇からすみませぬ。
struct point(int x; int y;);ってC99とかの標準なんですか??
古い頭ですみませんが、
struct point {
int x;
int y;
};
ならわかるのですけど。

ましてやstruct point get_point(void){ ...とか関数が構造体を
返してるし。

なんか無茶っぽいんですが釣りですか?
399デフォルトの名無しさん:03/11/15 22:08
send()でhtml形式の文字列を送るのにその中に変数を含ませたい時ってどうすればいいですか?
printf("%d",int);こんな感じのことがしたいんですが
正直にsnprintf()
401デフォルトの名無しさん:03/11/15 22:11
wsprintf
402デフォルトの名無しさん:03/11/15 22:12
>>401だけど
ごめん、sprintf(char*dststr, char*format,...)
sprintf()だと、dststrに十分な容量がなければバッファオーバーフロー
するよ。

だからsnprintf()
404質問:03/11/15 22:21
>>398
すまそ、まちがえました
struct point {
int x;
int y;
};

でした
405399:03/11/15 22:29
できました。ありがとうございました
>>404 んー、なんつうのかな。

あなたは関数内で構造体を宣言して、呼び出し元に返そうとしてるけど、
普通は関数へ構造体へのポインタを渡して、関数側でポインタを
参照して構造体へ値を代入するもんだと思ってます。
つうか、構造体側ではスタック上に構造体が取られているわけですから
スコープを外れた呼び出し元からはその構造体を参照できないでしょ。

普通、関数の戻り値ってのはレジスタ渡しなので特別な型以外は4バイト
以下のデータしか返せないと思ってました。
>>406
ネタですか?
>>406
ナニユートンネン
>>407 どのへんがネタだと?

linuxローカルかもしれんが、ライブラリをアセンブラで書くとき
戻り値はレジスタ渡し。
規格で構造体が返せるなら、それはそれで便利かもしれんがね。
>>407-408
ネタじゃなくて、ちょっと知識が古いだけだと思う。
411質問:03/11/15 22:44
>>406
そこの部分は問題ないかと…
おながいします
古いコンパイラはそうだけど、知識古すぎ。脳にパッチ当てれ
確かstdlib.hにdiv_tを返すdiv()があるよな
414406:03/11/15 22:49
patch -p < C99.diff パッチあたりますた。ご指摘ありがとう。

つうか、構造体同士の代入がコンパイラベンダーの実装において
保証されてない、ってのが頭にあったからさー。移植性に問題
ありそうだから。機能として気にはなるけどね。
>>414
> つうか、構造体同士の代入が...

おいおい、いつの知識で止まってるんだよ...。
>>414 よかったな。

漏れの周りにはこんなのもいるから。

patch -p < policy.of.other.lang.diff
エラー: COBOLer には適用できません。

>>415
>>406 氏、なかなかおもろいよな。
417質問:03/11/15 23:01
>>393 のプログラムに
void put rect(struct rect r){
put_point(r);
}
と,
main(){
struct rect a;
a=get_rect();
put_redt(a);
}
を足せばできますか?
なんでこんな変なプログラムかというと素人だからです…
>>417
結構粘ってるな。

rect な構造体は 2 つ必要だぞ。
419406:03/11/15 23:09
うーん、知識はK&R本第2版くらいじゃないかな。
C99の資料はとってきてあるんだけど。

構造体については、ポインタを含んでいて、関数内でmallocした
メモリをぶら下げているならば、構造体同士での単純なコピーは無理な
気がしますが…。でしょ?

構造体はもっぱらグローバル変数の替わりとかスレッドに渡すデータの
ポインタに使うのがせいぜいかな。
複素数とか扱わないから、その手の目的では使わないしなぁ。
構造体の代入はANSI Cの時点で規格に含まれているよ
421質問:03/11/15 23:12
で、結局どのようにすれば良いのでしょうか…
>>421
で、結局何が問題点なんでしょう?

ここは宿題スレではないzo。
>>419
確かに漏れもなんだかんだ言っても構造体の値渡しは正直気持ち悪い。
メンバーがint二つくらいならいいかな。
425406:03/11/15 23:24
{
画面を既にクリアしているものとして、
int i, j;
strict point p0, p1;
// 中略: p0とp1を取得すること。
for(i = 0; i < p1.y; i++){
if (i < p0.y) continue;
 for(j = 0; j < p1.x; j++){
  if (j < p0.x){
   putc(0x20); // 開始するxまでホワイトスペース出力
  } else {
   putc('*');
  }
 putc('\n');
  }
 }
}

こうか。うまくいけば*で矩形が書かれると思われ。
426デフォルトの名無しさん:03/11/15 23:43
>393
よーわからん課題だがこれでどう?
#include <stdio.h>
typedef struct{int x;int y;}point;
typedef struct{point origin;point corner;}rect;
void get_point(rect *p)
{
printf("origin enter x and y:");scanf("%d%d",&(p->origin.x),&(p->origin.y));
printf("corner enter x and y:");scanf("%d%d",&(p->corner.x),&(p->corner.y));
}
void put_point(point *p) { printf("(%d,%d)\n",p->x,p->y); }
void get_rect(rect *p){ get_point(p); }
int main (void)
{
rect r;
get_rect(&r);put_point(&r.origin);put_point(&r.corner);
return 0;
}
あなたが書いたプログラム見ると点を動的にとりたいのかな?
とりあえずこれで。
宿題スレはこちらです。移動してくだちい。
http://pc2.2ch.net/test/read.cgi/tech/1067175933/l50
yhooから株価を所得するにはどうすれば良いのでしょうか
429デフォルトの名無しさん:03/11/16 00:08
>>428
yhooから株価を取得する関数を呼ぶ
>>428
キーボード入力する、マウスを動かす/クリックする機能から作っていけ。
431デフォルトの名無しさん:03/11/16 00:19
>>430
とってもアナログな機能でナイス
yhoo って何?
433デフォルトの名無しさん:03/11/16 00:30
yhoo
これがヤゥフェ?ヤッホーの元となった神でしょうか?
ぃょぅ?
435デフォルトの名無しさん:03/11/16 00:32
(=・ω・)ノ yhoo
436デフォルトの名無しさん:03/11/16 00:35
(=゚ω゚)ノyhoo
だった。ゴメソン
>>435
新種だ!
438質問:03/11/16 00:41
>>426
さっくす!!
439デフォルトの名無しさん:03/11/16 00:43
ファイルサイズなどの情報を取得する関数ってありましたっけ?
440デフォルトの名無しさん:03/11/16 00:43
LSI C-86 Ver. 3.30c試食版 を使ってるんですが
何故かmado.c 3: ファイル windows.h がオープンできない (No such file or directory)
と言われます。FAQの通りにmath.hを付け加えてもだめでした。
解決策、ヒントなど教えてください
441デフォルトの名無しさん:03/11/16 00:45
>>440
そのコンパイラはANSI-Cに準じてるから ANSI-C には無い windows.h は読み込めないです。

素直にコンパイラを変えましょう。
>>2
>>440
ないものは開けないだろう。
なんでLSIC使ってんの?
443デフォルトの名無しさん:03/11/16 00:46
>>439
あると思うよ。
そうじゃなきゃ前もってメモリを確保できないし
444デフォルトの名無しさん:03/11/16 00:46
>>442
漏れも前使ってたよ。
アレを使用したエディターがvectorにあって使ってたや
>>439
汎用のものはない。
fseekで終わりに飛ばして、fposで得るのが汎用的な処理かな。
環境依存なら、他の方法もあるんじゃない?
446デフォルトの名無しさん:03/11/16 00:50
>>445
スマソ、ついwindowsで考えてしまった
windowsなら GetFileSizeなる関数あり
447デフォルトの名無しさん:03/11/16 00:52
>>441はい素直に変えます。ボーランドあたりでやってみます。
>>442すみません。なんとなくこれが自分的に感じよかったので
448いなむらきよし:03/11/16 01:02
キケー!
449デフォルトの名無しさん:03/11/16 01:11
>>448
ボーランドの使い方が分かりません。
どれをダブルクリックすればいいんですか?
とりあえず説明書にあったことはしました。
五月蠅い黙れ
451デフォルトの名無しさん:03/11/16 01:12
>>450
バイナリエディッタがないんです。
VC++をかいなよ
453デフォルトの名無しさん:03/11/16 01:19
やっぱり買うべきですか。
学生ではないので少々高めですね。
1万7千払います。どうもありがとうございました。
454デフォルトの名無しさん:03/11/16 01:27
>>453
んとねぇ。そうだねVCで練習してボーランド使いな

ちなみに何歳?って聞いたらだめかなぁ^^;
バイナリエディタ知っててコンパイルできないとは微妙なところですねw

ところでダブルクリックってなんですか?(>>449参照
455デフォルトの名無しさん:03/11/16 01:31
>>454 
21です。c:\Borland\Bcc55\binに色々あるので・・・
他のはライブラリ?っぽいし
最初は.txtを.cに変えるのかと思ってたけど
どうも違うみたいですし。すみません。
456デフォルトの名無しさん:03/11/16 01:35
VC.netになって激安でいいよねぇ(雑談
457デフォルトの名無しさん:03/11/16 01:40
>>456昔はどれくらいしてたんですか?
458デフォルトの名無しさん:03/11/16 01:47
昔というか、VC6は20万とかだったよね?>みんな
学割でやっと2万とかだよ
459デフォルトの名無しさん:03/11/16 01:59
!・・・20万て高杉。
俺が知らないだけか・・・
460デフォルトの名無しさん:03/11/16 02:05
VC.netは2万とかでかえるよ
Cygwin + GCC だとタダだ。
main関数に引数をつける理由を聞かせてください。
>>462
コマンドライン引数使うプログラムなら main に引数つけるのは当たり前。
使わないプログラムなら全く必要ないので引数つけない。
>>463
コマンドライン引数って、DOSとかでプログラムを指定する際に
プログラム名の後ろに何個かつけるやつですよね?
それはどういう時に使うんですか?
普通にプログラム中で入力させてはいけないのでしょうか
A:> copy
コピー元のファイルまたはディレクトリを指定してください: hoge.cpp
コピー先のファイルまたはディレクトリを指定してください: d:\
何かオプションはありますか? あればyを、なければnを入力してください: y
オプションを入力してください: -y
何かオプションはありますか? あればyを、なければnを入力してください: y
オプションを入力してください: v
何かオプションはありますか? あればyを、なければnを入力してください: n
1個のファイルをコピーしました

使いにくいだろがヴォケ
>>465

464は物心ついたときからGUIアプリしか知らないんだろ
普通にプログラム中で入力ってダイアログのことだぞきっと
>>466
GUIアプリの利用者でもわかりそうだが。
lpszなコマンドラインを知ってても…

と言ってみたがちょっと苦しいな。
物心付いたときは BASIC でした。
469デフォルトの名無しさん:03/11/16 05:13
>>468その表現もわからないよな・・・
BASICって様々な物が出回ってるからDOS用BASICとかわからんですよ

ってBASICってコマンドラインあるの?
俺はプラレールが好きだったな。
471468:03/11/16 05:27
誤解する人がいたらいけないので言っておくけど、
俺は >>464 じゃないぞ。
ちなみに BASIC ってのは PC-8001 の N-BASIC だ。
>>471
はい。で Cスレに何の御用でしょう?
いや、昔過ぎるとまたコマンドラインじゃ無くなるな、と。
474デフォルトの名無しさん:03/11/16 05:36
BASICしてる人ってVBやってうrの?
少なくとも俺は使ってないが。
476デフォルトの名無しさん:03/11/16 05:43
win32apiを勉強中の人っている?馴れ合い禁止?
>>476
ここがいいかと。

Win32API質問箱 Build14
http://pc2.2ch.net/test/read.cgi/tech/1065328397/
478デフォルトの名無しさん:03/11/16 05:49
だよなぁ・・・>>477さんありがとね('A`)
Don't mind it.
>>419
> 構造体については、ポインタを含んでいて、関数内でmallocした
> メモリをぶら下げているならば、構造体同士での単純なコピーは無理な
> 気がしますが…。でしょ?

はぁ ?

struct {
 char *a;
} s1, s2;

s1.a = (char *)malloc(10);

s2 = s1;

としたら、s2.a の指す領域が自動的に確保されるとでも思ってるのか ?
C はそんなに親切な言語じゃない。
単に、s1.a, s2.a が同じ領域指すだけだよ。
481デフォルトの名無しさん:03/11/16 07:52
>>480もよくぶり返したな。

ぶら下げてるってイメージがよくないな。

参照しているってイメージがよろしいかと
スレ違いスマソ
FORTRANのスレってないですか?
>>482
検索くらいしろ
>>483
すみません
実際ファートレインって、コンパイラ売ってるの?
インテルの奴しか見たことない
486334:03/11/16 09:10
>>336-336
ありがちょう
487デフォルトの名無しさん:03/11/16 09:13
>>485
フォートレインって何?
フォートランなら知ってるけど、ごめん。教えて
>>487
FORTRANのことだよ

「FORTRANは(処理速度が)超特急」などといわれるので
ファースト・トレイン(ファートレイン)などと俗称で呼ばれる(もちろん日本国内の研究者間のみ)
フォートランって言うのはもちろん知ってるよ
HPF - High Perfomance Fortran - (www.rz.uni-karlsruhe.de/~HPF/)の関連だの、
Visual Fortran(h18009.www1.hp.com/fortran/)だのがある。
現在では科学計算に用いられるだけで、あとはほとんど使われていないので、まあ廃れるわな。

このレスがスレ違いっていうのはもちろん知ってるよ・・・・・・じゃあ書くなよ、俺
490デフォルトの名無しさん:03/11/16 10:44
>>489
持つ彼、とっても勉強なりますた
491デフォルトの名無しさん:03/11/16 13:12
ファイルの作成日時を取得するにはどうすればいいですか?
X=関数(ファイル名);
みたいな関数ありますか?
492デフォルトの名無しさん:03/11/16 13:15
>>491
あるんじゃないの?
無ければファイルを右クリックプロパティで作成日調べられないしね
ここはC言語のスレだと思ったが・・・
>>491
Windows用なら知ってるが
495デフォルトの名無しさん:03/11/16 13:27
まぁ、間違えたんだよ。
そういうのにも親切に答えないとね
>>495
なんでよ。お前はそう言う責務をこのスレで負っているのか?
またお前か?昨日の奴だな?
498デフォルトの名無しさん:03/11/16 13:40
>>496
じゃあdat落ち汁

盛り上がってないじゃん、このスレ
「またお前か?」って言うことは・・・
こっちのセリフだよ
500デフォルトの名無しさん:03/11/16 13:45
今このスレに3人いるのか?
>>500
こっちのドリフだよ
      ̄↑ ̄
     笑うところ
502491:03/11/16 13:52
関数名だけでも教えてください。。。
だからスレ違いだって。
自動販売機のファームウェア開発用C言語ライブラリに、
ファイルの作成日時を取得する関数があると思うか?
(有るかもしれんが・・・)
適切なスレに移動せよ。
fstat
>>502
google()
VCではこうやります
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
int main(void){
struct _stat buf;
if(_stat("t.c",&buf)==0){
printf("作成日時 %s\n",ctime(&buf.st_ctime));
}
return (0);
}
おまえ等、意地悪するなよ
ちょっと答えりゃ終わることじゃねーか?
それを、あれこれ言ってレスしてる奴ほどスレ違い
ホントにそう思うのなら無視すりゃいいこと。
508デフォルトの名無しさん:03/11/16 14:06
関係ないんですけどOPENJANEの板一覧から街BBSがなくなったんですがどこにいったんですか?
浅香唯のCガールのスレはココですか?
510デフォルトの名無しさん:03/11/16 14:42
boostのregexって使ったことがPerlより速いの?
↑/ \ア?
はぁ
>>507
質問者が何の問題か分かってないことがいけないんだろ。
なんでそれを指摘することが意地悪なんだ?
>>491=>>507 の予感。
>>514
>>513ですが、さっき起きたよ。
漏れは夢遊病か何かですか?
>>515ですが、寝ぼけてた。
>515はなかったことにしてくらはい。
>質問者が何の問題か分かってないことがいけないんだろ。

名前だけ教えてくれって言ってるのに、文句言う前に一言教えてやればいいじゃねーか
スレ違いならスレ違いでどこのどのスレに行けばいいのか教えてやればいいじゃねーか

どっちに転んでも答えをハッキリ教えようとしない姿勢がいやらしいってことだよ。
だったら、無視しとけってことよ。
>>482
Fortran スレは最近 dat 落ちした。
yahooから株価を取ってくるにはどうすれば良いですか?
>>517
そうやってどっちに転んでもタダで答えをハッキリ聞こうとする姿勢がいやらしいと思うが。
だったら2chで質問なんかすんなよってことよ。
521デフォルトの名無しさん:03/11/16 16:51
>タダで答えをハッキリ聞こうとする姿勢
わけわからんよ
質問スレじゃないのか?ココは?
>>522 そーだね。
なんでこういうレスに反応するの?無視すりゃいいんだろw
質問する側にしては横柄だな。善意で回答しているだけなんだが。
527デフォルトの名無しさん:03/11/16 17:08
>>507が掲示板を使うのは難しいってこった
>>524
わかんねーやつだな
俺は506だよ
さっきから俺を質問者491だと思ってる奴がいるが
sumaso
わかんねーやつだな。スレ違いだって言っているのが。
>>509に言え!
みんなで独り言ですか?
自作自演でした
>>506>>1くらい嫁
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
535デフォルトの名無しさん:03/11/16 17:27
ん〜と、ANSI-Cのみ答えると?
無理だっての。
ISOでもJISでもいいんじゃないか?
そもそも「標準C」という用語が未定義のままだが
>>534
誰が仕切ってるのか知らんが
そういうこときちんと区切りたいなら2chで言うなとこっちが言いたい
>538
ヒソヒソ
>>538
毒物入りカレー
 ̄ ̄↑ ̄ ̄ ̄
笑うところ
if(>>534==>>538){
puts("Hello");
}
543デフォルトの名無しさん:03/11/16 18:49
>>538
あんま気にスンナ、って事を言うと漏れも疑われるがソレについては無視しる。
あまり変な人と構うなよ
>>519
環境依存(Linux で動くけど、Cygwin で動くかどうかは知らない)
というか、これは C と言っていいのか。(笑)
#include <stdlib.h>
#include <stdio.h>
FILE *Command_Buffer;
char name[50][40]; char price[50][40];
int i;

int main(){
Command_Buffer=popen("lynx -width=200 --dump http://biz.yahoo.co.jp/ranking/up/day/all.html |head -73|tail -50|awk \'{print $4,$7}\'","r");
for(i=0;i<50;i++){
fscanf(Command_Buffer,"%s%s",name[i],price[i]);
};
pclose(Command_Buffer);

for(i=0;i<50;i++){
fprintf(stdout,"%s\t%s\n",price[i],name[i]);
};
return 0;
}
545デフォルトの名無しさん:03/11/16 21:33
dirent.hがない場合、フォルダ内のファイル一覧を取得するにはどうすればいいでしょうか?
>>545
そんな処理系あるのかよ
C言語で、配列を戻り値にしたメソッドをどうやって作るんですか?
>>547
ポインタ
See also strcpy
550デフォルトの名無しさん:03/11/16 22:16
char c[] = "123.45";
として、文字列"123.45"を
double型の変数に浮動小数点数として123.45を代入するにはどうしたらいいですか?
お願いします。
>>550
strtod
552デフォルトの名無しさん:03/11/16 22:17
>>550
標準関数を眺めるクセをつけろ

ヒントは標準関数 stdlib にある
>>551
>>552
ありがとうございます。調べてみます。
>>552の答えって>>551かな?
stdio.hにもあるけどね。
555デフォルトの名無しさん:03/11/16 22:23
>>554
stdio.hにもあるのは知らなかった
strtodともう一つあるからそっちを使うといいよ、そっちのが引数が少ないし簡単に意味が取れる
556550:03/11/16 22:30
あったー!
>>555
atofですね。発見しました。
atof なんか使わないで素直に strtod を使っておいたほうが良い。
>>557
まぁ、そうなんだろうけど、
atof ってものがあることを知らないよりは、
知ってるほうがいいでしょ。
559デフォルトの名無しさん:03/11/16 22:43
俺が思ったのは strtod を使わないで素直に atof を使うなんだけど。

なんで strtod のが素直だと思うの?
アフォだから
561デフォルトの名無しさん:03/11/16 22:46
いやいや
>>557はアフォじゃないと思うよ
afot
563デフォルトの名無しさん:03/11/16 22:51
>>562
ワロタぜオイオイ
564デフォルトの名無しさん:03/11/16 23:01
tesu
565どこがおかしいの?:03/11/16 23:02
すいません、かなりレベルが低いと思いますが、
#include <stdio.h>

main()
{
int kake[8][8] , i, j = 1 ;

puts(" | 1 2 3 4 5 6 7 8 9\n--+---------------------------");

while (j != 10) {
printf("%2d|", j);
i = 1;
while (i != 10) {
kake[j-1][i-1] = i * j;
printf(" %2d",kake[j-1][i-1]);
i++;
}
puts("");
j++;
}
return 0;
}
なぜか、無限ループしてるのか処理が終わりません。
どうしてでしょうか・・・。
566どこがおかしいの?:03/11/16 23:03
↑の処理は掛け算の九九表を作ろうとしています。
半角スペースが読みにくくなっていますが、よければ
教えてください。
int kake[8][8] , i, j = 1 ;

while (j != 10) {

while (i != 10) {
メモリ破壊
569デフォルトの名無しさん:03/11/16 23:08
ジャストフィットな否定ってどうも使えない・・・小心者ですから
i < 9とやり
j < 9とやりましょう
あとは kake[8][8]と>>567さんの通りです
kake[9][9]としましょうね
570どこがおかしいの?:03/11/16 23:11
みなさんご教授ありがとうございました!
昔、C を勉強し始めたころに
人に教えてもらったりしてたときは、
コメントは /* */ で書け
と教わったような気がするんですけど。
このスレでも、宿題スレでも // で書いてるのがけっこうあります。
一応、gcc で // でも大丈夫なことは確認したのですが、
// は、コンパイラーが OK ってことにしてるのですか?
それとも、ANSI C とかで正式に認められてるものですか?
572デフォルトの名無しさん:03/11/16 23:18
c99で//って認められなかったっけ?
>>571
そーゆーことなんで大目にみてください
宿題スレはC/C++だからne。。。
>>565
int kake[9][9],i,j;
printf("|123456789|\n----------");
for(i = 1;i <= 9;i++){
printf("|");
for(j = 1;j = 9;j++){
printf("%d",kake[i-1][j-1] = i * j);
}
printf("|\n");
return 0;
}
576571:03/11/16 23:33
>>572-574
レスありがとうございました。
「C99 仕様 変更 コメント」でググってみたらありました。

なんか気持ち悪いなーと思うけど、
古い考えは持ち続けても良くないので、
頭切替えることにします。
577デフォルトの名無しさん:03/11/16 23:34
>>576
実は/*のが新しいといったら驚く?
>>576
実は /+ が最新。驚
gccは#もコメントと見なしてくれる
580579:03/11/16 23:42
そうしたらプリプロセッサがつかえないわけだが(鬱
書き込む前に気づけよ俺。。。
581579:03/11/16 23:42
そうしたらプリプロセッサがつかえないわけだが(鬱
書き込む前に気づけよ俺。。。
>>580-581
二度も反省しなくともいいだろw
>>579
それは、そうだっけ?
解釈できないディレクティブ=コメント?
# の直後に define とはかけないよね。
ああ、つっこみ遅れて鬱
585579:03/11/16 23:45
>>582
二重カキコスマソ

>>583
もちろんくだらないネタです
gcc では asm("; の後ろにコメントかけるらしい。
587576:03/11/16 23:51
>>577
残念。
ググった先に書いてあって驚いてきてたので、
2度目では、驚きません。(笑)

>>578-586
間違った情報も覚えてしまいそう。
自分でちゃんと調べます。(笑)
>>586
出来るかヴォケェ
>>546
あるよ。そもそもなんでディレクトリ操作系がansiに盛り込まれなかったか考えればわかることだ。
思い込みで書くのは見苦しいからやめようね。
#せめて、「そんな処理系見たことない」なら兎も角も。
590Not 546:03/11/17 00:32
逆切れする暇あったらマニュアルでも読めばいいのに・・・
>>588
できないのかヴォケェ?
592デフォルトの名無しさん:03/11/17 06:20
インラインアセンブラだっけ?

だからコメントになるわけじゃないでしょ
インラインアセンブラのコメントだね。
594デフォルトの名無しさん:03/11/17 07:22
>>593
やっとわかった罠(;´∀`)
;でコメントだったね
595デフォルトの名無しさん:03/11/18 00:49
10進数を2進数に変えるプログラムをつくりたいのですがおしえてください。
10進数は15まで表現できればいいので2進数は4ビット限定にしたいのですが…
例えば14ならば1110というように


>>595
数値はみな2進数表現
>>595
宿題スレにもまったく同じ質問をしている人がいるよw
598デフォルトの名無しさん:03/11/18 01:08
>>596
荒らしは虫
重複やめれ
>>595
int check_bit( int decimal, int bit_number )
{
int temp, bit;

temp = decimal >> ( bit_number - 1 );

if ( ( temp % 2 ) == 0 ) bit = 0;
else bit = 1;

return bit;
}

int my_pow( int x, int y )
{
int i, temp;

if ( y <= 0 ) return 1;
else if ( y == 1 ) return x;

for ( temp = x, i = 0; i < ( y - 1 ); i++ ) {
temp = temp * x;
}

return temp;
}
int to_bin( int decimal )
{
int i, temp, bin;

for ( bin = 0, i = 4; i > 0; i-- ) {
temp = check_bit( decimal, i );
temp *= my_pow( 10, ( i - 1 ) );
bin += temp;
}

return bin;
}
I'll be back.
unionって便利だね
>>602
構造体に含めるとき不便だけどな

>>599
ありがとうございます
しかし、何やってるのかさっぱりわかりません
なぜそのように長くなるのかわかりません
こういうのはダメでしょうか?↓

#include <stdio.h>

char* d2b(int x,int digit,char *dest){
int i;
for(i=digit-2;i>=0;i--){
dest[i]=x%2==0?'0':'1';
x=x>>1;
}
return dest;
}

int main(){
int i;
char dest[]="0000";
for(i=0;i<16;i++){
printf("%s\n",d2b(i,sizeof(dest)/sizeof(char),dest));
}
getchar();
return (0);
}

>>604
駄目
>>604
いいんでないの?特に問題なさそうだが・・・
つーか599は俺も気になってた。何であんな長いの?まあ、別にいいけど・・・
ああ、
文字に1と0入れるか
ビットに1と0入れるかの違いか
逝って来るぽ・・・
やっぱちゃうやん、戻ってきた
>>606
4ビット限定が生きてない
LSIC試食版で練習してます

scanfやgetsにて入力した文字列分のメモリを確保する方法ってのはありますか?
mallocであれこれやってみたけど分からず・・・
>>610
自分の知る限りだとわからないです・・・ごめんなさい
何かしらの方法で 入力状態 にして、あとは入力文字の長さを調べるということはどうでしょう?
>>609
たったそれだけかよ
汎用的にかかれているだけじゃん。
客の要件に対して幅広くものごと捕らえることが出来ないと
設計は無理だよ。

これで、決めうちで関数書いたら
「拡張性が無い」などと煽るわけだろ?
どっちにしても、ソース出す奴は神。
それを適当にダメだしする奴は○。
設計?
前提として「4ビット限定」と書かれているのに?
>>612
汎用的にもなってない
ユーザー側で入力値に必要なバッファサイズを計算しなければならない
>>612
○って伏字なのか?・・・・
あと、荒らしは虫でよろしくね〜

>>610
環境依存(windows)で悪いけど
stdin->_cntに現在の入力文字の長さが格納されてるみたいだから、それつかってみたら?
いま少しやってるけど。。。。
>>615
(゚Д゚)ハァ?
ここでは事実を述べると荒らしですか
環境依存ネタの方が余程スレの趣旨を外していると思うが?
>>610
入力“した”文字列分なら

char *src, *dst;
dst = (char *)malloc(strlen(src) + 1); // '\0' の分も忘れずに…
/* コピーするなら dst = strdup(src); の方が手っ取り早い */

だが、入力“しようとする”文字列分なら不可能。
「scanf() や gets() は使ってはいけない」と言われる所以。
C言語ってなににつかうのですか
>>616
環境依存OKのスレへ逝ってください。
620617:03/11/18 11:38
>>618
肩こり、滋養強壮、神経痛などによろしいようです。
>>612
無駄な拡張はいらない
二次方程式を解くためにニュートン法を持ち出すようなもの
>>615です。

>>617
なるほど、勉強になりました。

ちなみに入力文字をリターンしようとして
ch = getchar();
fputc (ch, stdin);
などとやってしまい。入力を戻せないことがわかった・・・アホみたいな俺
>>615
環境依存OKのスレへ逝ってください。
>>622
ungetc
>>615です。

>>624
やってみました…が
「abcと入力」
ungetc
出力が[ab]となりますねぇ・・・stdinの長さまで変えてくれないのかなぁ?・・・
>>611-617
レスサンクス

scanf()が良くないってのはよく聞くけど、gets()も同様に良くないんですね。
>617氏、参考になりました。
>>617_>>626
そうなの?
個人的に改行が文字列として汲み取ってくれないから scanf はあまり好きじゃなかったけど gets もなんだ

誤魔化してつくろったソースでもいい?
ちなみにwindowsって前もって逝っておいたけど、マジでこれはLinのgccでやったら無理でした(もすこしまってね
>>626
gets は絶対に使うな! だが
scanf はよく知らない人間は使うな!だ

最大フィールド幅や文字集合で
バッファオーバーフローや改行が読めない問題は回避できる

このスレもレベルが下がったな
高レベルの人間が出払っているだけかもしれんが
#include <stdio.h> #include <stdlib.h> #include <string.h>
//メイン関数
int main()
{
int len; // 文字列の長さ
char ch, *s; // 文字と文字列

ch = fgetc (stdin);     // 最初の文字を受け取るフリをして入力をしてもらう
len = stdin->_cnt;     // 入力文字列の長さを受け取る
s = (char*)malloc (len); // 長さ分メモリ調達
memset (s, '\0', len);   // 全部をターミネータで初期化
*s = ch;           // 最初の文字を入れる
fgets(s+1, len, stdin);  // ごまかして最初の次から受け取る
printf ("%s\n", s);     // そして確認表示
return 0; /* 正常終了*/
}
とりあえずコメント入れたしこれでどうでしょう?
>>629レベル下げちゃってごめんなさい。・゚・(ノД`)・゚・。
レベルレベルって、あちこちで鬱陶しいですね
>>614
ユーザー側でサイズ決めれるようにすることは
汎用的だと思うんですが・・・
5ビットでも10ビットでもいけますよ

ああ、d2bの関数内で
int size=sizeof(dest)/sizeof(char);
ってやれってこと?それなら言いたい意味はわかるが、これは「汎用的」とは関係ない
>>632
> ユーザー側でサイズ決めれるようにすることは
> 汎用的だと思うんですが・・・
> 5ビットでも10ビットでもいけますよ
バッファサイズが足りないとき
溢れこそしないが誤った値を返すだろ

> ああ、d2bの関数内で
> int size=sizeof(dest)/sizeof(char);
> ってやれってこと?
できねえよ
スコープをなんだと思ってるんだ
634633:03/11/18 12:00
ついでに
sizeof(char) == 1
は仕様だ
>>634仕様とまで言わなくていいんじゃないの?
「常識」で
>>604-605ってわざと難しく書いてるのかなぁ?
>>633
>バッファサイズが足りないとき
>溢れこそしないが誤った値を返すだろ
おかしなことを言う奴だなお前、
この関数(d2b)を使うユーザがそういうこと管理するのは当然だろ
これは標準関数でも同じだろが!

それに、あの関数の使用している場面で
「バッファサイズが足りないとき」
ってどういうときに起こる?
そういうことは、おきないように書いてるんだけど?

>>634
あのさいくら決まっていたって
sizeof(char)を省くわけにはいかんのよ

例えば水の比熱を使って計算する時に
水の比熱は1って決まっているから
(式)×1
とは書かずに
(式)
とかく、で学生は(式)×1の方は忘れて(式)の方だけ覚えてしまう
そしてあるとき、鉄の比熱で計算しないといけないときわからなくなってしまう
つまり、(式)×1の1は意味のあるものなんだと言うことを明確にしなければいけない
つまりこの場合の例でいうとsizeof(dest)/sizeof(char)でいいわけだ
>>637
> >バッファサイズが足りないとき
> >溢れこそしないが誤った値を返すだろ
> おかしなことを言う奴だなお前、
> この関数(d2b)を使うユーザがそういうこと管理するのは当然だろ
> これは標準関数でも同じだろが!
はあ…
先に入力値の格納に何ビット必要か計算するのか…ユーザーが
>>637
おかしな事をいうな、ユーザーというのはプログラマとも作成された物を使う意味があるので微妙な判断をゆだねられるときはどちらかとはっきりしてほしいです。

横槍いれてごめんね
>>637
> つまり、(式)×1の1は意味のあるものなんだと言うことを明確にしなければいけない
> つまりこの場合の例でいうとsizeof(dest)/sizeof(char)でいいわけだ
関数内で '0' とか '1' とか使ってる時点で sizeof(char) をわざわざ入れる理由が限りなく薄いんだが…
汎用的ですか?
>>639
「汎用」関数の使用者かな
>つまりこの場合の例でいうとsizeof(dest)/sizeof(char)でいいわけだ
良くない。countofマクロにでもして封印しろよ。
ロックは人生だ!って規正が掛かるよぉ・・・文長いとだめ?
644≠633:03/11/18 12:22
>>635
実際仕様な訳だが(ry
>>635
うん、ちょっとしたお茶目で見逃して
charが1バイトは仕様に書いてあるのみならず、もう”常識”であると言いたかっただけ
仕様に書いてあっても忘れてる人とかいたり、でも char は 1バイト と強調したかったんです。

#include <stdio.h>
// bit_number分左シフトと論理和が真なら真を返す
int check_bit( int decimal, int bit_number )
{
return (decimal & (1 << bit_number))&&1;
}
// x の y乗
int my_pow( int x, int y ) {
if ( y <= 0 ) return 1; return x * my_pow(x, y-1);
}

// decimal を bit 表現する
int to_bin( int decimal ) {
int i, temp, bin;
for( bin = 0, i = 0; i < 4; i++ ) {
temp = check_bit( decimal, i ); bin += temp * my_pow( 10, ( i ) );
} return bin;
}
// メイン関数
void main() {
printf ("%d\n", to_bin(13));
}
これでどう?
結構わかりやすいんとちゃう?
>>612は、何でこんなに必死なんだろ?
この程度じゃダメなのか?

char *binstr( int aVal, char *iDst )
{
  /* ***** 内部変数定義 ***** */
  int iBit;

  for( iBit=4; iBit>=0; iBit-- )/* ビット数分ループ */
  {
    /* ***** 2 進数文字に変換 ***** */
    iDst[iBit] = "01"[aVal%2];
    aVal /= 2;
  }
  return iDst;
}
俺らからはすれば、なんでいちいち文句をつけてくるかわからない

科学では×1が大事だとかプログラミングの記述とは関係がない言い訳まで持ってくるし
構って欲しくて自演か・・・
休める時には休めよタコイカナマコ
この関数は
何桁の2進数に変えるのかというのが目標です

>638先に入力値の格納に何ビット必要か計算するのか…ユーザーが
何ビットつまり、何桁の2進数にするかはユーザに決めてもらう以外ないでしょ?
例え10進数の16までできるようにしたとしても
表示は8桁にしたい場合だってあるじゃないですか?
1111
00001111
いってることわかります?
>>612は欲求不満
>>653
ハイ、わかりました。

じゃあその自分の欲望にそろえて自分で作ってください。

俺達はお前の道具じゃないんだからな
あと、言いたいことは
>>599がどうしてあんなに長いプログラムになるのか不思議なのです
突っ込んどいて、尻蕾かよ 
>>656
漏れが >>646-647 に省略しておいたから、親切にもコメント月でね

>>656
どっちにしても、上手い方法ではない
お礼の一言も無いのか?
661617:03/11/18 12:40
つか、誰が誰やらわかりません…

>>604 は簡潔に書けていて(・∀・)イイ!と思います。
「呼び出し側がバッファを提供する場合は、そのサイズも
指定してやる」という C のセオリーにも則っていますし。

もちろん、呼び出された関数側でメモリを割り当てて
それを戻す手もありますが、そうすると呼び出し側には
「確実に解放すること」という責任が生じます。

sizeof(dest)/sizeof(char) に関しては…まあ汎用的にするなら

 #define numberof(d) (sizeof(d) / sizeof(*(d)))

ですねえ。
/*
  MFC (Windows) や Xt (X11 Intrinsics) でも
  同様のマクロが定義されています。
*/
>>660

お礼って、658に対してでしょうか?
ありがとうございます
でも、何で599がそんなややこしいやり方するのかわけわかりません
ココで回答されている人は私と同レベルなのでは?と思ってしまうぐらいです。
663619:03/11/18 12:43
>>662
あぃ、そうだね。
同レベルの人もいるね。
それじゃあ、君みたいなスレのゴミはどこかへ逝ってください。

漏れも邪魔かも知れないので退散
>>662
>ココで回答されている人は私と同レベルなのでは?と思ってしまうぐらいです。

傍観していたが、寝たの区別も(ry
>>661

まあ、main関数は初心者っぷりが出ているが
あくまでもテストルーチンだからね
>>615
FILE構造体のメンバーに直接アクセスするなんて正気の沙汰じゃないな。
>>666
環境依存と書いてあるけど何か?
やむを得ず見たいな断りは言っておいたはずだけど
>>667
環境依存の意味も(ry
>>667の中の人の>>615だけど、

批判するなら、他に案を出してみてよ。
といいたくなる
>>669
だよね
言いたがりの奴って言うのはどこにでもいる
政治評論家も出馬してみろ
>>669
「fgets()で1行の入力がバッファを超えるなら、さらにfgets()で(ry」
とか色々あるだろ。
672617:03/11/18 12:52
>>662
>でも、何で599がそんなややこしいやり方するのかわけわかりません
まあ、ゴリゴリ書いてるうちに変に複雑になって
あとで見直したときに「何でこんなんなってんの?_| ̄|○ i||i ガビーン…」
ということはありがちですから。
質問は入力された文字列と同じだけのメモリを確保するってことだよな。
「入力した」と言っているんだから。
>>673
ワークバッファ使用禁止とは書かれてないだろ
>>669の中の人の>>615だけど、

>>671
コマンドプロンプトでも4096、もしくは256文字までしか入力できないでしょ?
2ch見るぐらいの性能あるPCならソレぐらいのバッファはあると思うよ。

あと、叩くなら全部言ってくれないと解らないよ。ごめんね、人の心が読めるわけじゃないんだ。
冗談とかネタなら略してイイと思うけどね

>>672
よくあるね。
あれ?・・・なんでこんなややこしくなってんの?とか
で、その所為でバグったりして結局バグ取してコードをきれいにしなくちゃいけないとw
このレベルのプログラミングでそうなってしまうことが問題なのでは?
>>615だけど、

>>676
うん、そうだね。
でも本人がいないんだし別に議論する意味があるのか?と疑うけど
問題は入力した文字列というのが入力時にバッファに入ったもののみを指すのか、読み飛ばした部分も含まれるのか。
前者ならバッファ内の文字列の長さをはかってその分メモリを確保すればいいんだが。
C言語使いって、こんな時間に暇な人ばかりなんですか?
>>615だけど、

>>678
無理やり難しくしてない?
もっと簡単にしてみようよ。

標準入力バッファに入った物全部か、もしくはバッファから読み取られた物も長さとするのか?

って事だよね?

>>679
よかったね、運がいいんだよ

ちなみに
Cが出来る人とかの割合で言えば
C:10, java:3, cobol:3
と人数が多いからその分ココにいてもおかしくない(とパチこいてみる
おれは、今は無職(求職中)だけどね
>>675
何が言いたいのかいまいち理解できないが、リダイレクトすれば
4096もしくは256の制限などないのだが。
>>679
「C言語使い」と言うより、むしろ、「ネラー」がだろう。
>>682
そういうこと言うと荒らし扱いされるよ
つうか、Cで就職は考えたこと無い(てか俺には無理)のだが
Cの仕事ってデスマチって比較的少ないですか?
(イメージとしてはコツコツと自分ひとりで開発してる感じがします)
Java系NET系はデスマーチばっかでもういいかげんやめたいんですが・・・
>>680
バッファってストリームのバッファのことじゃないよ・・・
>>682
ハッ!・・・そんな手もあったんですね。。。
プログラムを直に使うのだとばかり思ってたよ。
対策の仕様はあるのかなぁ...

>>686
標準入出力って意味じゃないんですか?
>>687
gets(buf)のbufのことに決まっているだろうが・・・
もう一度>>610を読み直してみろ
>>688
え?
bufの長さを求めるんですよね?
gets(buf)やっちゃうとマズいんじゃないでないでしょうか?

えぇと・・・ものすごい誤解してました。
正直スマンカッタ

>>610
char buf[128];
char *s;
として、いったんbufに入れて s の長さをどんどん拡張していくって意味ですよね?
char buf[てきとーに];
char *p;
gets(buf);
p=malloc(strlen(buf)+1);
>>689
scanfやgetsで入力"した"と言っているだろ。
>>691
過去ログの何処で言ったか解らないような方法で責めないでくださいよ・・・

>>678のことですよね?
>>692
s/で/にて/
>>610
>>693
ポカ━(゚д゚)━ン・・・
漏れは>>610からずーーーっと間違った解釈をしたまま話していたわけなんだね・・・・ゴメンデスつдT
>>661
4ビット限定をわざと複雑にして汎用的と宣っているくせに
肝心な部分の詰めが甘い

バッファサイズを関数使用者に決めさせるのは構わないが
例えば15の2進数表示に対して
2ビット+ヌル文字分のバッファしか用意してなかった場合でも
特にエラーは出さないね?

そのくせ
>>653
> 例え10進数の16までできるようにしたとしても
> 表示は8桁にしたい場合だってあるじゃないですか?
> 1111
> 00001111
とかお笑いだね
char* d2b(int x,int digit,char *dest){
if(strlen(dest)>digit){
digit=strlen(dest);//exit(1);
}
int i;
for(i=digit-2;i>=0;i--){
dest[i]=x%2==0?'0':'1';
x=x>>1;
}
return dest;
}
>>696
#include <stdio.h>

char* d2b(int x, char *dest, int n)
{
int i;
dest[n-1] = '\0';
for (i = n-2; i >= 0; i--, x /= 2) {
dest[i] = x % 2 + '0';
}
return x ? NULL : dest;
}
斜め読みしてる中でmy_powって一言を見かけた時点でかなり引いた
偏見はいかんと思って我慢して読んだがやっぱりダメ
しょぼくてすまないんですが、
カーニハンのプログラミング言語の演習の4-12をやったら、こんな答えしか出せませんでした。

void itoa(int n,char *s){
static unsigned char num=0;
if(n<0){*s='-';num++;n=-n;}
if(n/10)itoa(n/10,s);
s[num++]=n%10+'0';
s[num]='\0';
}

もっとスマートな答え、あると思うんですが、だれか教えてください。

あと、もひとつ。
関数の引数に
void func(double a[5]);
みたいに書いた配列aは関数内でコピーが作られずに、
ポインタとして使われてるみたいなんですが、
引数の所は、double a[5]って書いてもdouble a[]って書いた場合と変わらないって事なんですかね?

だれかおしえてください。
>>699
前者の問いは本持ってないから問題自体がわからなくて答えられない。
とりあえず、0以上の整数に限定していいのか?ってのと、わざわざ再帰しているのは
そういう指定があるの?ってくらいかな。

後者についてはその通り。
dobule a[5] でも double a[] でも double *a でも変わらない。
701699:03/11/18 22:30
>>700
お答えありがとうございます。
前者は、整数を再帰を利用して文字列に変換する関数です。
整数nは負でも動くようにしてあるつもりです。

後者は、double a[5]でも、double a[]でも同じ事なんですね・・・初めて知った。。。
>>701
ごめん、再帰だなーと思った後はよく見てなかった。
確かに負数の場合も対応してるね。
漏れももうちょっと考えてみる。

ちなみに、関数の引数に書く場合には、double a[5][10] と double a[][10] も同じ。
つまり一番左側の添え字は省略した場合と同じになる。
#define DEC2BIN(DEC) for(c=DEC|1;putchar((~c==c-1?DEC&1:c<0)["01"])&&(c+=c);)
int main(int c){
DEC2BIN(14);
return 0;
}
>>699
-2147483647とか入れてみたか?
705700:03/11/19 00:20
>>699
とりえあず2回以上呼び出せないのを直してみた。

void itoa(int n,char *s) {
static unsigned char num;
if(n<0){
*s++='-';
itoa(-n, s);
} else {
if(n/10) itoa(n/10, s);
else num=0;
s[num++]=n%10+'0';
s[num]='\0';
}
}

ぐぐってみたけどいまいちこれだっていうのがないなぁ。

ttp://users.powernet.co.uk/eton/kandr2/krx412.html
ttp://www-mcs.c.oka-pu.ac.jp/~m-inoue/ex-4/12.html
>>699
char * を戻さないと、スマートにはならんのじゃなかろうか?

void itoa(int n, char *s) {
 div_t d = div(n, 10);
 if (n < 0) {
  *s++= '-';
  d.quot = -d.quot;
  d.rem = -d.rem;
 }
 if (d.quot > 0) {
  itoa (d.quot, s);
  for (; *s; s++)
   ;
 }
 *s++ = d.rem + '0';
 *s = 0;
}
707デフォルトの名無しさん:03/11/19 00:42
age
708デフォルトの名無しさん:03/11/19 00:46
4^3とやっても答えが64になりません。コンパイラのバグですか?
>>708
コンパイラのバグではありません。

4 ^ 3を 4の3乗としたいのだと思いますが 4 ^ 3 は排他的論理積をします。

#include <math.h>
と最初に入れて
pow (4, 3);
としましょう
710デフォルトの名無しさん:03/11/19 00:52
>>709
できました。勘違いしていたみたいですね。
ありがとうございました。
711700:03/11/19 00:52
>>699
>>706 こんな感じでどうでしょ?

char *itoa_(int n, char *s)
{
if(n>=10) s = itoa_(n/10, s);
*s++=n%10+'0';
return s;
}

void itoa(int n, char *s)
{
if(n < 0) {
*s++='-';
n=-n;
}
*itoa_(n, s)='\0';
}
>>706
言ってることとソースが噛み合ってないように見えるのはオレだけ?
見ていて思ったんですが
C言語でそうやって再帰処理する時に
どのくらいの階層までスタックOKなんでしょうか?
100回ぐらいは大丈夫ですか?


搭載メモリによるのでしょうか
OSによるのでしょうか?
コンパイラによるのでしょうか?
>>713
OSとCPUじゃないの?

詳しくは本を読んだほうがいいよ

「アッカーマン」ってぐぐればドボンかもね
>>714
ありがとうございます
>>713
プログラムに割り当てられたスタック領域のサイズと、
再帰呼び出しされる関数の仮引数・ローカル変数のサイズによる。

スタック領域のサイズを1MBとすると、ここであがっている
itoaなら数万階層は大丈夫だろう。
>>716
ありがとうございます

で、質問なんですが
「プログラムに割り当てられたスタック領域のサイズ」
「再帰呼び出しされる関数の仮引数・ローカル変数のサイズ」
「スタック領域のサイズ」
っていうのは何か明確な計算方法あるんでしょうか?

714からアッカーマン関数を教えてもらって見ているんですが
こういう感じで少しずつ増やしていって調べるしかないんでしょうか?

#define TEST 1
#if TEST
int count = 0;
#endif
int A(int x, int y){
#if TEST
count++;
#endif
if (x == 0) return y + 1;
if (y == 0) return A(x - 1, 1);
return A(x - 1, A(x, y - 1));}
#include <stdio.h>
#include <stdlib.h>
int main(){
printf("A(3, 3) = %d\n", A(3, 3));
#if TEST
printf("A(x, y) は %d 回呼び出されました.\n", count);
#endif
return EXIT_SUCCESS;}
>>717
そんな難しいの作らなくてもいいんじゃないの?
>>717
テスト時に A()の中で printf("%p\n",&a) とでもして、
いくつづつ減るか見ればいいんじゃ。

スタックサイズは環境依存。
720699:03/11/19 10:27
皆さんいろいろありがとうございます。
関数のポインタとかあんまり考えたこと無かったので、
もっかい考えてみることにします。
関数ポインタってあまり考えないねぇ・・・
特殊なことしないとあまり使わなくない?
>>721
だからナニよ
>>722
友達なくすよ
お前のやってる仕事(宿題)では使わないだけだろ。
>>724
うん、だって仕事も宿題も一回もやったこと無いから。
独学だし・・・。・゚・(ノД`)・゚・。 ウワーン
初心者が最初に関数ポインタ使う機会は
イベント処理したい時ぐらいかな?
押されたボタンに対して処理を振り分ける場合
if-elseじゃ長くなるので
関数を登録しておいてそれを呼び出すようにすればいい
むしろコールバックとかではないかな、嫌でも使うだろう。
wndproc
>>726
qsortだと思います。
>>729
忘れてたよ
731719:03/11/19 15:11
なんで関数ポインタの話になってんだ?と思ったらtypoしてた…

  テスト時に A()の中で printf("%p\n",&x) とでもして、

の間違いだ。誰かつっこんでくれYO
構造体配列の初期化ってのは

struct hoge test[30] = {"\0","\0",0}
こんな感じにやればtest[0]~test[30]までしっかり初期化されてるんでしょうか。

いちいちforで30回まわして、その中でmemsetとかやらなくても大丈夫・・・ですよね?
733デフォルトの名無しさん:03/11/19 19:23
すいません質問です。
*p = &a(宣言の後)
だったらコンパイルエラーになるのに、なんで
char *p = &a(宣言の時)
だったらいけるんですか?
pに入ってるアドレスの中の場所にaのアドレスを入れるんだからエラーになると思うんですが・・。
なんで始めに宣言した時に初期化すればエラーにならないんですか?
>>732
残った要素は0の値で初期化される
735デフォルトの名無しさん:03/11/19 19:40
>>733
マジ?
736733:03/11/19 19:43
>>735
すいませんマジで疑問です。
737デフォルトの名無しさん:03/11/19 19:46
char *p = &a;は
(char *)p = &a;ってこと。ポインタへの代入。
*p = &a;はchar型への代入。
>>737
>>733
char *p = &a は
ポインター変数pを宣言して変数aのアドレスの値で初期化しているだけ。

*p = &a(宣言の後)は、普通 *p = a;  こうする。
pの指し示している場所の変数にaの値を代入、 a=a; と同じ。
>>734
サンクス
741デフォルトの名無しさん:03/11/19 21:00
C言語入門書でなにかお勧めはありますか?
ちなみにプログラミングというものはしたことがありません。
742733:03/11/19 21:06
>>737>>739
ありがとうございます。
で、char *p = &a; の時に限ってpにaのアドレスを放り込むと考えていいんですね?
743733:03/11/19 21:16
>>737>>739
ありがとうございます。
で、char *p = &a;に限ってaのアドレスをpに放り込むってことでいいんですね
>>741
すれ〜違い〜♪
>>739
>*p = &a(宣言の後)は、普通 *p = a;  こうする。

>>733はポインタに値を入れたいんだろうから「p = &a;」だろ?
746nanasi:03/11/20 00:41
質問があります

#include <stdio.h>
int add(int n);
void main(void)
{
int i= 1;
printf("1st time ; i=%d,address=%x\n",i,&i);
i = add(i);
printf("2nd time ; i=%d,address=%x\n",i,&i);
i = add(i);
printf("3rd time ; i=%d,address=%x\n",i,&i);
}
int add(int n)
{
int i=0;
printf("add function; i=%d,address=%x\n",i,&i);
i+=n;←なんでここにnを代入するのかわかりません教えてください・・ほんとに・
ここにnを代入する必要があるのでしょうか?
nを代入する意味が知りたいのです
このプログラムの意味は1つの引数を与えて加算する関数ですちなみに自動変数です
return i;
マルチハケーン
>>732
struct hogeの中身がわからんが、
struct hoge test[30] = {{0},};
で充分初期化される。
中の中括弧がstruct hoge、外の中括弧が配列。
補足するとmemsetと違って確実に浮動小数点数なら0.0、ポインタならNULLにしてくれる。
>>732
memset (test, '\0', sizeof test);
ってやれば全部を初期化できる
配列の要素数の制限ってどこで調べられますか?
というか制限ってあるんでしょうか?

今、char型の[960][720][3]の要素を持った配列を作ったんですが、
コンパイルするときはエラーを吐かないのに
いざ実行となると正常に宣言できないみたいです。
win2000でbccを使ってます。
>>751
autoな配列ならスタックサイズの制限を受ける。
そうでないなら多少は大きく取れるかもしれないがロードモジュールが肥大化する可能性がある。
MBオーダーの配列は動的確保するのが無難。

尚、960x720x3くらいはautoでも確保できる環境もある。
よって詳細は環境依存のスレで。
うむ。VC++でもオプションで取れるように出来るな。
char以外の配列だと、サイズを計算する時に型のサイズを入れるのを忘れて間違うことがある。
>>753
だからスレ違い。おまけに質問者はbccだってば。
>>754
それは馬鹿。
756754:03/11/20 07:37
>>755
クリティカルヒット(T_T)
757751:03/11/20 07:38
>>752
すいません。
宣言の時点ではじかれてるみたいなんですが、動的確保できるものでしょうか?

例えば、
//---------------
int i, j;
char RGB[960][720][3];

printf("プログラムを開始します\n");

〜〜〜〜〜〜
〜〜〜〜〜〜
〜〜〜〜〜〜
return 0;
//---------------
というように宣言の直後にある標準出力さえ受け付けないんですが・・・

まぁ、なんだかんだ言う前に今からやってみます。
758754:03/11/20 07:41
>>757
char (*RGB)[720][3]=malloc(960*720*3);
使い終わったら
free(RGB);
760751:03/11/20 08:32
やっぱりできねぇ、

と思ったら、>>758のやり方でできました。
というか、
char *RGB = malloc(960*720*3);
でやっちゃいました。
宣言のときに確保すればよかったんですね。

レスくれたみなさん、ありがとうございました。
任意のソフトのiniファイルのように、
項目1=hoge
値=10
文字列=test

項目2=

(hoge や test はスペースを含む20文字以内の文字列)
というファイル出力をやってみたいと思ったんですが、
入力し構造体に取り込むときにどうしてもうまくいきません。
fscanf(fp,"文字列=%s",hoge[i].str)を使ってやったとして、スペースが入っていると取得できず、
fgets()を使うと文字数の指定が良くわからず、うまく取得できません。
どのようにすればいいんでしょうか?
>>761
とりあえず一行読んでからパースしてはいけないのか?
>>761
環境依存スレの方がいいんじゃないかなぁ?
違ったらごめん
>>761

もしWindows限定ならAPI使ったほうが楽だぞ
GetPrivateProfileString(),GetPrivateProfileInt()
WritePrivateProfileString()とか
>>762-764
レスサンクス
とりあえずは>762の方法で、一時的に他の変数に格納して切りだしてみます。
ポインタが指す文字列配列の大きさを量ることは出来ますか?
sizeof(p);
sizeof(*p);
前者だとポインタそのものの大きさが、後者だと1文字分ってことになってしまいます。
767766:03/11/20 19:50
むぅ、そもそもこんなことやる方が間違ってる気がしてきた。
他のやり方を考えてみます。
前者でポインタの分がかえってくるなら、pは、
char *pあたりで、char p[n]ではないってことだろ。
じゃあ、手段はstrlenあたりしかない。
769デフォルトの名無しさん:03/11/20 21:23
#pragma once使ったらobsoleteとかいわれた。
obsoleteはテメーだ>#ifndef,#define, #endif
>>769
>obsoleteはテメーだ>#ifndef,#define, #endif

その様子では、お前はおそらく
あと10年は MS に振り回され続けるな・・・

ご苦労さま(w
771貧乏紙:03/11/20 22:34
>>746
ローカル変数iはそのつど0初期化するので引数nはそのままスルーでreturnで戻される
意味ないと思うけど・・・
iがグローバル変数かstatic修飾されて入れば意味が出てくると思うけど。
それは君が自分で作ったものでないと思われるのでくつった人に聞いてみれば?
下記のようにmallocで生成した領域へのポインタをvoid型ポインタに
入れてからfreeすることは可能でしょうか?
自分でテストしてみてもちゃんとfreeしてくれてるのかよくわかりません。

char *cp = (char *)malloc(10);
void *vp = cp;
free(vp);
>>772
できる
>>772
void *vp = cp;

free(cp);

何が違うって言いたいんだ?
775デフォルトの名無しさん:03/11/20 23:00
>>772
それが出来なかったらfreeにポインタのコピーを渡して解放するなんてことはできなくなります。
char *cp = (char *)malloc(10);
この時点でvoid *をchar *に入れてるから出来ないと困る罠
777デフォルトの名無しさん:03/11/20 23:08
>>772
可能。
free()の宣言を見ろ。
>>void free(void *ptr);
void * になっているということは、ポインタの値しか受け取らない
ということ。
何型のポインタかの情報はいらない。
お答えサンクスです。
>>776-777
確かによく考えればその通りですね。
そういや最近まで、static な大域変数はファイルスコープになるって思ってたんだけど、
いやそれ自体はあってるんだけど、include したら駄目なんだよな・・・。
今まで書いた static に意味はなかったってか・・・。
>>778
無礼者
.c ファイルを #include するのですか?
782778:03/11/20 23:41
>>780
ハァ?
783779:03/11/20 23:41
>>781
そうしてた。
だから分割コンパイルもコンパイル速度の為だけかと思ってた。
>>781
ヘッダーファイルにstatic int i;とか書いていたんだろ。
785784:03/11/20 23:42
マジかよ(´д`;)
>>779
全く意味が無いわけじゃないぞ。staticの有無で確保されるメモリセグメントが違う可能性がある。
環境によっては、実行モジュールのサイズが影響を受けることもある。
>>783
外部の .c ファイルを #include してもコンパイルは速くならないぞ
788779:03/11/20 23:54
>>786
あーさっき見た >>751 のやつだね。
auto か static って、ヒープだとかスタックだとか確保される領域が違うんだよね、確か。
わざわざ教えてくれてアリガトネン
>>788
それとこれとは別
>>789
むしろそれは>>786
791779:03/11/20 23:59
>>787
うん分かってる。
static な大域変数の使い方がやっと分かったから、
最近になって make を使って分割コンパイルに挑戦してるんだよ。
これでも触り始めて三年以上になるんだけどね・・・。
792779:03/11/21 00:01
>>789>>790
マジですか、違って覚えてたか・・・。
調べてきます。
>>792
間違っていないけど、779の言っているのは関数内で作った変数につけるstaticでしょ?(意味としてはこれだけがstaticであるべきだと思うんだが)
今問題にしているのは内部リンケージを持たせるためにグローバル変数につけるstatic(なんでinternにしなかったんだろう)
static scope と static extent
795779:03/11/21 00:21
あ、分かった。
796779:03/11/21 00:26
僕が >>779 で言ってるのは内部リンケージにする為の static で、
>>786 が言ってるのは、静的な意味にする為の static ですよね。

んで、>>789>>790 が上の二つの意味は違うから区別しろよって、
忠告してくれてるんですよね。
797793:03/11/21 00:27
あ、「779の言っているのは・・・」じゃなくて「786の言っているのは・・・」だった。スマソ
ここまでのあらすじ↓
800デフォルトの名無しさん:03/11/21 00:41
800
8011000:03/11/21 00:44
とんで1000ゲト
int box;
FILE *fp;
fp = fopen("abc","r");

while ( (box = getc(fp)) != EOF){
  /*----------中略-------------*/
}


これでabcっていうファイルを読み込もうとすると最後まで読み込んで頂けないのですが、
何がおかしいんでしょうか。
/*----------中略-------------*/
804↑ ここが問題:03/11/21 00:58
break; に違いない。
中略のところは
cnt[box]++;
が入ってます。

ハフマン符号のアルゴリズムのお勉強中なので、どの文字がどれだけ出たかカウントしたいと思っているのです。

ファイルはテキストファイルじゃなくてどっかから拾ったFLASHです。
Windows 環境なら
fp = fopen("abc","rw");
バイナリなら "rb" にしておけよ。
>>806
だったらとりあえずfopenの"r"は"rb"にしろ。
間違った
fp = fopen("abc","rb");
たったそれだけの式を中略にしたのはどうして?
うわ もしかして 説明書レベル!?


ほんとごめんなさい どうもありがとう> r→rb
いや なんでやろ ほんとすみません 何をかきこんでいるのやらー

ごめんなさい どうもありがとう
精進せいよ!
アリガトン もうちょっと説明書読んでから書き込むようにするよ

ほんとスレ汚してごめんね
本当にrをrbにしただけでよかったのか・・・
確かASCIIコードにEOFみたいなのがあったと思うけど、テキストモードだとそれで終了しちゃうように出来ているってことかしら。
それとも単にCRLFがLFに置き換えられたために、読み込んだバイト数がファイルサイズよりも小さく見えて勘違いしたとか?
いや、ただ単純にrbを知らなかっただけです

うわーはずかしいよー

一文字読み込むごとに文字数カウントしてて、そのカウント数がファイルサイズとかけ離れてたんで、なんでかなーと。
>>818
じゃあ>>817か。
それです
printf("保守\n\n\n\n");
822デフォルトの名無しさん:03/11/21 18:23
下にあるみたいに、*finが示すファイルから1行づつ取得して行き、それを画面に表示。
全部読み込んだら、*finが示すファイルの最後に"追加文字列ですよ。\n"を追記。
この"追加文字列ですよ。\n"を画面に表示しようとして、再度fgetsしたら、うまくいきません。
これをうまく処理するにはどうすればいいのん?

・・・・・・・
fin = fopen("./file.txt", "r");
fout = fopen("./file.txt", "a");

while((fgets(buf, sizeof(buf), fin)) != NULL) {
printf("%s\n", buf);
}

fprintf(fout, "追加文字列ですよ。\n");

fgets(buf, sizeof(buf), fin);
printf("%s\n", buf);

・・・・・・・
>>822
とりあえず、一つのファイルを読み込みと追加の二回同時開くような事はやめとけ。
824822:03/11/21 18:50
>>823
じゃあ、こんな場合はどーすんですか?
>>824
どんなばあいよ?
一度全部を取得して、ソレを鑑定汁
"r+"でfpを開くとか。
まあもっとも、書き込む前の位置は
覚えておかないといけないけどネ。
>>824
開くとき >>827、書き込む前に ftell()、書き込んだ後 fseek()。
位置を覚える&戻すならfgetpos&fsetposじゃない?
#include <stdio.h>
#define M 80
#define N 80
int set_matrix(int M,int N); // ')'が必要といわれる
int mplus(int p,int q,int M,int N); // ')'が必要といわれる
main(){
int i,j;
int m1[M][N],m2[M][N],r1[M][N];
printf("Enter size of matrix :\n");
printf("Horizontal : "); scanf("%d",&M); //メモリ上に配置しろといわれる
printf(" Vertical : "); scanf("%d",&N); //メモリ上に配置しろといわれる
printf("set matrix X\n");
m1[M][N] = set_matrix(M,N);
printf("set matrix Y\n");
m2[M][N] = set_matrix(M,N);
r1[M][N] = mplus(m1,m2,M,N);
printf("result of X+Y :\n");
for(i=0;i<M;i++){
for(j=0;j<N;j++){
printf(" %2d ",r1[i][j]);
}
printf("\n");
}
return 0;
}

Borland C Compiler 5.5.1使用 自分的に何が間違っているのがわかりません(エラーメッセージの意味も理解できん)。
なんでエラーなのか、どうしたら直るのか、教えてくださいエロイ人。
831830:03/11/21 22:48
上のヤツの外部関数っす。

int set_matrix(int M,int N){ // ')'が必要といわれる
int i,j,p[M][N];

for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("Enter matrix element[%d][%d] : ",i,j); scanf("%d\n",&(p[i][j]));
}
}

return p;
}

int mplus(int p,int q,int M,int N){
int m,n;
int R[M][N];

for(m=0;m<M;m++){
for(n=0;n<N;n++){
R[m][n] = p[m][n] + q[m][n];
}
}

return R;
}
(;´-`).。oO(MとかNは変数なのか定数なのかどっちなんだと…)
833デフォルトの名無しさん:03/11/21 23:06
Lx行で次の警告が出ます。どうすればいいでしょうか?
'function' : 'struct _iobuf *' と 'int *' の間で型に互換性がありません。

int a(void);
void b(int *);

FILE *fp;

int main(void)
{
a();
b(fp);←Lx行
~~~~~~~~~~~~~~~~~~
return 0;
}

int a(void)
{
char ch;
fp = fopen(fname, "r");
return ch;
}

void b(int *fp)
{
fclose(fp);
}
834デフォルトの名無しさん:03/11/21 23:07
>>838
読んで字の如くだが。
835830:03/11/21 23:07
>>832
いや、配列のサイズも要素もキーボードから入力させようとしたんだけど、いまいち方法がわからなくて。
あてずっぽう的にこんなプログラムに・・・・

おかしいのはわかってるんだけど解決法がさっぱり浮かばないんすよ・・・_| ̄|○|||
プロトタイプ宣言するか、mainを下に持っていくか。
837デフォルトの名無しさん:03/11/21 23:09
>>835
int set_matrix(int M,int N){のMやNが展開された後のことを考えればわかる
M、Nのdefineを止めて、main(){
int M , N; int i,j
...
とやれば、真っ当にC99を実装しているコンパイラなら通る気がする。
ちなみにBCCはC99を実装していないので、mallocとか使わないと通らない。
というか、素直に int set_matrix(int m, int n) とかでいいだろ。
840830:03/11/21 23:15
>>836 >>837

なるほど、きちんと順番どおりに処理していくようにするためには関数の順番も重要になるのか・・・・。

だいぶエラー減りました。あと、どうしてもわからないのが「')'が必要」といわれるヤツなんですが、
ドコにどう必要なのかが漏れも知識では補完できない・・・・。
>>830
配列の大きさを動的に変えたいというのなら検索キーワードは malloc、動的確保あたりか。
多次元配列の割り当てはちょっと難しいかもしれんので
ttp://www.catnet.ne.jp/kouno/c_faq/c6.html#16
あたりを参照してがんばってみ?
842デフォルトの名無しさん:03/11/21 23:20
>>840
順番とは関係なしに
int set_matrix(int M,int N);
を展開すると
int set_matrix(int 80,int 80);
になるだろ。
これじゃ構文エラーだ。
843842:03/11/21 23:22
あー、もしかしてプリプロセッサを知らないのかな。
コンパイルよりも前に#includeや#define等を処理するものがあるの。
例えば今回ならstdio.hの中身を取り込んで、MとNを80に置き換える。
コンパイラにはそういう処理を施したものが渡される。
844830:03/11/21 23:32
>>842
あー、そういうことか。確かにそうだ。
いまそこを直してみたんだけど、なんだかエラーが増えてしまった・・・・
ファイルから12.345のような小数点のある数字を読み込みたいのですか
以下のように書くとエラーになります。
どこがまちがっているか教えて下さい

#include <stdio.h>
int main(int argc, int* argv[])
{
FILE *fp;
float tmp;
fp=fopen("k1.txt","r");
fscanf(fp,"%f",&tmp);
fclose(fp);
return 0;
}
846デフォルトの名無しさん:03/11/21 23:40
>>845
エラー内容くらい書いてほしいものだけど。
k1.txtを開けなかったんじゃないの。fopen直後にfpを確認してみて。
それと、argvの型はchar **
その前に argc も argv も使ってないし。
すみません。コンパイルは通るんですが、実行途中にとまってしまいます。
コンソールにruntime errorと表示されていて、R6002 - floating point not loaded
と表示されています。
849デフォルトの名無しさん:03/11/21 23:52
>>848
なんででるんだろうな。
float tmp=0.0;にしてみて。
VC++か。
いつでもいいからtmpに対して何かすると出なくなるね。
851833:03/11/21 23:59
>>833です。どなたかお願いします。
0.0にしたら直りました。
その後、0.0を取ってもエラーが出なくなりました。
double tmp;と書いて実行した後、float tmp;に書き換えると
エラーになるみたいです。
ちなみにVC.netです。詳しいことはわかりません。
>833 836では答えにならないか?
>>853
ならないよ。
>>849
このアドバイスの理由が知りたかったり・・・
856833:03/11/22 00:08
プロトタイプ宣言は始めにしてありますよね?
>>852
俺も何故エラーになるのかは分からないが、それはともかくとして
scanf() で double 取りたいときは "%lf" だから注意が必要。
>>855
http://f1.aaacafe.ne.jp/~pointc/log770.html じゃないの?
>>856
まずfpの型が仮引数(FILE *)と実引数(int *)で異なる。
そして引数の名前とグローバル変数名をかぶらせるな。
>>857
>scanf() で double 取りたいときは "%lf"
アドバイス、ありがとうございます。
悩んでいたのですごく助かりました。
860849:03/11/22 00:11
>>855
聞きたいのはこっち・・・・
0.0にしてみたら?ってのは直感で。
861857:03/11/22 00:12
>>860
・・・直感かよ!
862845:03/11/22 00:15
>>860
すごい直感ですね・・・うらやましいです
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 FILE *fp;
 float tmp;

 fp = fopen("k1.txt", "r");
 if(fp == NULL) {
  return EXIT_FAILURE;
 }
 fscanf(fp, "%f", &tmp); /* tmp を double にすると %lf にする */
 fclose(fp);

 return EXIT_SUCCESS;
}
864849:03/11/22 00:16
http://www.catnet.ne.jp/kouno/c_faq/c14.html
ここの13

そうなのかー!
865849:03/11/22 00:18
float *を渡した時点で判断しろよな・・・・
呼び出し側からなら引数の型が分かるんだからさ。


と書こうと思ったけど、リンク時の問題だからそういうわけにもゆかないのか。
14.13 の状況になんかなった事なかったけど、
実際にあるんだな。
まぁ、本当にこれが原因だったなら、だけど。
大きなプログラムなら先ずそうはならんと思うので
安心してええとは思うが。
867833:03/11/22 00:41
>>858
ありがとうございますた。解決しました!
ただ、void b(FILE *fp);って変じゃないでしょうか?見慣れないのですが・・・。
868845:03/11/22 00:42
>>864
864の13を読んで思ったんですが
もしかしたら、アプリをたくさん起動していて空いてるメモリが
少なかったから起こったのかもしれないです。
バグったコンパイラ使うなアフオ
VC++で0.0に初期化するものとしないもののアセンブリのコードを比べたら、
する方にはEXTRN__fltused:NEARってのがあった。
やっぱりC FAQの14.13みたい。

じゃあやっぱりfloatの変数を作った時点でコンパイラが判断しろよな。
>>867
全然変じゃない。
>>833で使っているfcloseのプロトタイプもint fclose(FILE *);だ。
872833:03/11/22 01:06
>>871
ありがdです。
変数を構造体で管理する事のデメリットってありますか?
引数を沢山取る関数があってソースコードが見辛いので、それらを構造体にまとめて
スリム化するラッパー関数を作ろうと思うのですが、そういうのって普通なのかなと。
>>873
よくあるよ
意味のある構造体のまとまりにすれば問題ないと思うよ

ラッパーって?検索してもよくわからないのが出てきてよくわからない…ごめん
ラッパーを作ったとしても、結局は同じ数だけ代入してそう・・・。
876デフォルトの名無しさん:03/11/22 06:05
単に引数をまとめるだけなら無意味だと思うね。
でもさ、初期設定とかするなららくじゃね?
>>874-877
レスどうもありがとうございます。
GUI ウィジェットの振る舞いを設定する変数で悩んでいたのですが、OO に慣れて
いるので、クラスっぽくまとめたいなと考えています。

>>874
ラッパーは wrapper の事です。特に機能を追加する訳ではないので、こう書きました。

>>876
デフォルト値を設定して、必要な部分だけ値を変更できるようにするつもりです。
>>878

代入は同数でも
xa=0;
ya=0;
wa=640;
ha=480;
move(xa,ya,wa,ha);
move(xa,ya,wa,ha);


a.x=0;
a.y=0;
a.w=640;
a.h=480;
move(&a);
move(&a);
なら構造体のほうが引数の効率はよさそう。

これが配列の場合
x[i]=0; は base(x)+index(i)
a[i].x=0; は base(a)+index(i)+displacement(x)
で単純変数に分がありそう
880デフォルトの名無しさん:03/11/22 14:01
10000*10000の行列の積を1秒以内で終わるアルゴリズムを教えてください
どうしても、3秒の壁が越えれません
>>880
スレ違いです。
882デフォルトの名無しさん:03/11/22 14:07
じゃ、別で質問したら答えれるのかな?w
すごく・・・環境依存です・・・
884デフォルトの名無しさん:03/11/22 14:28
はいはい能書きだけは一人前ですねw
結局分からないんですね
こんなところで聞いた俺がバカでした
885デフォルトの名無しさん:03/11/22 14:56
「2003年11月22日」を struct tm 型の変数に入れるにはどうすればいいですか?
886デフォルトの名無しさん:03/11/22 15:02
知ったかさ〜ん、簡単質問がきましたよw
887デフォルトの名無しさん:03/11/22 15:03
>>885
tm_yearに103、tm_monに10、tm_mdayに23を入れる。
888887:03/11/22 15:04
23じゃなくて22
889885:03/11/22 15:30
>>887-888
ありがとうございます。
その方法も考えたのですが、
それだと tm_wday, tm_yday が取得できませんし、
構造体のメンバーに直接アクセスするのもできれば避けたいのですが。。。
890デフォルトの名無しさん:03/11/22 15:40
>>889
これでどう?構造体のメンバーにアクセスしちゃうけど。

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

int main()
{
struct tm a={0,0,0,22,10,103,0,0,0},*b;
time_t c;

c=mktime(&a);
b=localtime(&c);

printf("%d\n",b->tm_yday);

return 0;
}
いつからtm_mdayは0オリジンになったんだ?
>>891
何を言っているの?
>>892
23日ならtm_mdayは23だろ。
なんだ、23日じゃなくて22日か。すまん。
>>893
あんたは>>885の22日が23日に見えるのかい?
896885:03/11/22 17:17
>>890
やっぱりメンバーに直接アクセスしないと難しいみたいですね。
mktime() を使うとうまく行きそうなので >>890 を参考にして作ってみました。

とりあえず↓でやってみます。
ありがとうございました。
897885:03/11/22 17:18
#include <stdio.h>
#include <time.h>

void make_time(struct tm *t, int year, int month, int day);
void print_member(struct tm *t);

int main(void)
{
    int year = 2003;
    int month = 11;
    int day = 22;
    struct tm t;

    make_time(&t, year, month, day);

    print_member(&t);

    return 0;
}

void make_time(struct tm *t, int year, int month, int day)
{
    t->tm_mday = day;
    t->tm_mon = month - 1;
    t->tm_year = year - 1900;
    t->tm_sec = 0;
    t->tm_min = 0;
    t->tm_hour = 0;
    t->tm_isdst = 0;

    mktime(t);
}
898885:03/11/22 17:21
void print_member(struct tm *t)
{
    printf(" tm_sec: %d\n", t->tm_sec);
    printf(" tm_min: %d\n", t->tm_min);
    printf(" tm_hour: %d\n", t->tm_hour);
    printf(" tm_mday: %d\n", t->tm_mday);
    printf(" tm_mon: %d\n", t->tm_mon);
    printf(" tm_year: %d\n", t->tm_year);
    printf(" tm_wday: %d\n", t->tm_wday);
    printf(" tm_yday: %d\n", t->tm_yday);
    printf("tm_isdst: %d\n", t->tm_isdst);
}
だれか。885にC言語を教えてやってくれないかな
俺からもよろしく頼む
#include <stdio.h>

char *str[] = {
"str1",
"str2"
};
void change_str(char, char *, int);
int main()
{
change_str('a', str[0], 0);
return 0;
}

void change_str(char chr, char *buffer, int x)
{
buffer[x] = chr;
}
最後のところでページ違反になってしまうのですが…。
よろしくおねがいします。
901890:03/11/22 20:50
http://www.bohyoh.com/CandCPP/C/Library/mktime.html

mktime時にtm_wday等をうまく設定し直すんだ。ということはlocaltimeは無駄か。


>>900
"str1"とか"str2"は文字列定数。だから書き換えちゃダメ。
change_str('a', "str1", 0); はだめだろ
903900:03/11/22 20:57
>>901 >>902
文字列定数のこと忘れてました…
どうもありがとうございました。
>>897
はあ… mktime を使うのか
うまくやるなあ

で,何で構造体メンバに直接アクセスするのを避けたいの?
905デフォルトの名無しさん:03/11/23 00:31
制御構造の式が長くなりすぎて見にくいです。
だれか区切り方を教えて下さい!!
まず、「制御構造の式」がどういうものかから説明しろよ。
907デフォルトの名無しさん:03/11/23 00:43
こんな感じ
int aaaaaaaaaaaaaaaaaaaaa
int bbbbbbbbbbbbbbbbbbbbb
int ccccccccccccccccccccc

if(1 == aaaaaaaaaaaaaaaaaaaaaa || 2 == bbbbbbbbbbbbbbbbbbbbb ・・・

すごい適当やけど、とりあえず一行に収まらないです。
printfとかやったらカンマで区切れたような。
なんか方法ないですか?
if(式)とか、while(式)とか、for(式;式;式)
なんかの式の事でしょ?
2行にすれば
>>907
if(  1 == aaaaaaaaaaaaaaaaaaaaaa
  || 2 == bbbbbbbbbbbbbbbbbbbbb
  || ・・・
 )
911デフォルトの名無しさん:03/11/23 00:48
>>910
だめみたいです。コンパイルエラーで
「終端されていないコメント」と出ました。
コンパイラ何使ってるんだ?
913デフォルトの名無しさん:03/11/23 00:49
>>912
gccです。
んな馬鹿な!
どこのコンパイラ使ってんだ?
gccなら大丈夫なはず
エラーの出たソース晒した方が早いかも
916デフォルトの名無しさん:03/11/23 00:51
>>914
ごめん!!
ソースの上の方に書いてたコメント開きっぱなしだった!w
さっきの方法でいけました。ありがとう!!
int *p = ...;
if(10 /*p ) ってやってるとか...。
918917:03/11/23 00:53
一歩遅かったか...。
919デフォルトの名無しさん:03/11/23 01:02
今時Cですか?
920デフォルトの名無しさん:03/11/23 01:03
おやおや・・・
921デフォルトの名無しさん:03/11/23 01:21
まあまあ
>>919
おまいは何使ってるんだよ?
923デフォルトの名無しさん:03/11/23 01:24
>>922
博多弁ばってんが、なんね?
エディタを使って下記の内容のバッチファイルを作って、”c:\”に保存します
ってどうやればいいのですか?エディタの出し方がわかりません。お願いします。
>>922
肛門でも使ってるんだろ
>>925
そんなわけないだろ。馬鹿か。
>>924
バッチファイルな環境にsedは純正では入ってないな
どういうことでしょうか?
自宅のパソコンではできないのでしょうか?
>>924
Win98ならば
スタート→ファイル名を指定して実行で
edit
と入力してOKをクリック
OSいい忘れました。2000使ってます。
>>930
エディタ=メモ帳
>>930
コマンドプロンプト開いて、edlin ファイル名 で OK (藁
>>931さん ありがとうございます。あと、
set PATH=”というコマンドで、MS-DOSはファイルを探すときに、まず、カレントディレクトリを探し、なければこのコマンドで指示したディレクトリ(フォルダ)を探すようになります。カレントディレクトリとは、現在開いているフォルダのことです。

上記の文の2行目はカレントディレクトリを”c:\lsic330c\temp”に変更せよというコマンドです。

これってどういう事を意味しているんですか?
C のインタープリタで、既存の C のライブラリを呼び出せるものを探してるんですけど、
無いみたいですね。
(゚Д゚)ハァ?
メモ帳ならnotepadだろ
>>933
>>1 ぐらい読んでから書き込め。

> まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
>>933
format c:\
938デフォルトの名無しさん:03/11/23 02:56
cで書いたプログラムからワードやエクセルにカキコすることってできますか?
>>938
できます。
int main(int argc, char *argv)
{
FILE fp;
fp = fopen("c:\\Program files\\Microsoft Office\\Office\\WinWord.exe","w");
fprintf(fp,"hello world");
fclose(fp);
return 0;
}
>>939
Word のパスが違うのですがどうやってパスを取得すればいいですか?
>>940
レジストリの
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\[バージョン]\Word\InstallRoot\Path
から取得します。
念のため、WinWord.exe のバックアップをとることをお勧めします。
>>941
レジストリってどうやってアクセスするの?
互いにボケてる予感・・・
Cレヂ
これなんかどうよ?
http://www11.plala.or.jp/studyhall/cpp/BcbRegistry.html
環境依存の話はするな。
>>945
もう終わり?ネタおわんのはえーよ
>>925
そういえば最近知ったんだが、
アナリストって「肛門を使う人」って意味じゃないんだってね。
Visual Basic 、Visual Studio、Visual C#、Visual C++
と様々なソフトがありますが、違いを教えてください。
Visual Basicと Visual Studioの言語は何ですか?
Visual Basic : Visual Basic (VB)
Visual C++  : C++
Visual C#   : C#
Visual Studio : VB, C++, C#
Visual Basicっていう言語はあまり耳にしないのですが、
主にどういったものに利用されてますか?
ここはネタとスレ違いの質問で1000まで行くインターネットですね
最近インターネットというものをはじめました

特ににちゃんねるというプログラムはとても面白いものですね。
DQNでも使えるC言語
954デフォルトの名無しさん:03/11/23 10:59
Cで、
bool flag;
と定数宣言すると、boolが未定義ですとか怒られますけど
どうして?コンパイラはgcc
955デフォルトの名無しさん:03/11/23 11:00
>>954
C++と違ってboolなんてないから。_Boolならあるかもしれないが。
>>954
stdint.h, stdboo.h煎れとけ
整数配列を任意の整数で埋め尽くしたいときはなにを使えばよいですか?
for
0クリア限定でmemset
>>959,960
なるほど、そんなもんは無いのですね
ありがと
>>938
QueryInterface
963デフォルトの名無しさん:03/11/24 16:35
void (*(**[])p)()[];
これが何型かた5秒以内に答えられた人は神
うわー、兄これ?
965デフォルトの名無しさん:03/11/24 16:41
ゴメン、間違った
void (*(*(***p)())())();
これが何型か5秒以内に答えられた人は神
>>965
なんか急にすっきりしますたね。
>>965
を答えるためにキーを打つだけで5秒掛かる
968617:03/11/24 17:09
>>965
「void (*(*(***p)())())()」が何かと問われれば、1.2秒で「関数だ」と答えられる。
p が何かと問われれば、…あー…15分待って…
関数じゃないだろ
970デフォルトの名無しさん:03/11/24 17:28
>>969
じゃあ、なに?
答えらんねーのに、偉そうにしてんなよ
printf(????) とか main(????) とかは関数と呼ぶことは分かりました。
if とか while, for, break, returnなどはなんと呼べば良いのですか?
命令とかでいいのでしょうか。
972デフォルトの名無しさん:03/11/24 17:35
>>971
制御構文
>>968が今更617と名乗る理由を知りたい。
>>973
クッキーに残って、ついそのまま書き込んでしまっただけだろ。
たまに見かけるし、俺もやったことやる。
今さら突っ込むほどのことではないと思うが?
>>970
ポインタだろ。
976デフォルトの名無しさん:03/11/24 17:56
>>975
はいはい、正解です
977デフォルトの名無しさん:03/11/24 17:58
やっぱり2ch能書きだけは一人前だけどCがマトモニ
読み書きできる人っていないんですね
つーかそんな糞コードは今までに見たことない
979デフォルトの名無しさん:03/11/24 18:47
>>978
当たり前だろ、こんなのが実際に使われてたはずないじゃん
お前相当あほだろw
>>979
普通 typedef 使って崩すだろ
揚げ足取るしか脳が無いやつはほっとけ
>>978は正しくて>>979はかまって君で揚げ足とってる脳が足りない奴

どうせコレ読んでさっそく揚げ足取るためにレスしようとするぜ
ハッハッハ!見事に無視してやるからさっさと書けな
982デフォルトの名無しさん:03/11/24 18:56
ハッハッハ!
ウェーハッハッハ!
釣り師が煽られ粘着に変身
985デフォルトの名無しさん:03/11/24 19:23
なんだ、結局答えらんね〜のかよw
987デフォルトの名無しさん:03/11/24 19:33
>>986
その通りですが、何か?
>>987
1秒以内にできた?
じゃあ1000とり合戦いくぜ
988ゲトズサ
自作自演は無視な
誰とは言わないが
991デフォルトの名無しさん:03/11/24 19:38
extern "Java"
ピスタチオってどうしてあんなに美味いんですか?
993デフォルトの名無しさん:03/11/24 20:21
>>963
それ、関数だから型ないよ……?
(void型の戻り値を返すという意味だが、
 関数が、void型という分けではない…)
そろそろ 1000?
まだだよ〜
もう少しだね。
おし〜えて〜おじさん〜♪ おし〜えて〜おじさん〜♪
>>997
おじいさんは死にました
CFA9999たけDA
1000デフォルトの名無しさん:03/11/24 21:31
C1000たけDA
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。