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

このエントリーをはてなブックマークに追加
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/

各種リンクは>>3-20あたり(誰か適当に貼って)

C言語なら俺様に聞け! Part 68
http://pc2.2ch.net/test/read.cgi/tech/1069552879/
2デフォルトの名無しさん:03/12/09 00:18
2うんこまんこ
3デフォルトの名無しさん:03/12/09 00:18
【コンパイラ】
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
4デフォルトの名無しさん:03/12/09 00:20
>>1
























6デフォルトの名無しさん:03/12/09 00:33
1げとお
registerって結局どういうときに使うの?
ステート数を節約したいときとか
がんがん使うからレジスタに割り当てて速くするのだ。ってな時に使うものだが、
最近の賢いコンパイラはそういう事は勝手にやってくれるからなあ。

あんまり意味ないかも。
10デフォルトの名無しさん:03/12/09 01:37
&をつけたときに警告してもらいたい時とか。
register使いの帝王になれ。
最速スピードキングの称号が与えられるぞ。
>>7
volatileと比べる時。
>>12
は?
具体例を出していただけませんか?
14入門者:03/12/09 03:31
void mystrcpy(char *target, char *souce)
{
while(*souce != '\0') *target++ = *souce++;
*target = '\0';
}

ヌル文字って付加しなくてもよいですか?
付加しなくても動いてるけど。
>>14
その書き方なら*target = '\0'; は必要。
例えば、
{
char s[] = "abcd";
char t[] = "fghij";
mystrcpy(t, s);
printf("%s\n", t);
}
とでもして実行してみれば必要かどうか判るだろ。
16入門者:03/12/09 03:49
>>15
理解りますた。ありがとっす。
>>13
いや、以前どれくらい速さが違うか調べたら
volatileより3倍くらいかな速かったけど、型修飾無し
の物と余り変わらなかったので。 いらねーと思って。
まあ、コンパイラーが優秀なだけなんだろうけど。
>>17
おまいさまは、volatileがどういう意味だか判ってらっしゃるのですか?
gccでみるかぎり、-O2つけるならregisterいらん。
アセンブリ言語のソースまったく同じ。
初心者です。文字列(10文字)を逆に表示するプログラムがわかりません。誰か教えてください
>>20
#include <stdio.h>
int i;
char stack[10];
void push(const char c) { stack[i++] = c; }
char pop(void) { return stack[--i]; }
int main(void)
{
  char str[11] = "0123456789";
  while (i < 10) push(str[i]);
  while (0 <= i) printf("%c", pop());
  return 0;
}
>>21
ありがとうございました!助かります!
えっマジだったの?違うよネタだよーーーーーごめーーーん
>>22 ごめんよーー、ちゃんとしたのはこっちね。
#include <stdio.h>
#include <string.h>
void putrs(const char *s)
{
  const char *p = s + strlen(s);
  while (s < p--) printf("%c", *p);
}
int main(void)
{
  putrs("0123456789");
  return 0;
}
25デフォルトの名無しさん:03/12/09 12:57
次期P2Pの仕様 part7
http://tmp2.2ch.net/test/read.cgi/download/1070647427/

まとめサイト(Wikiへの直リンク禁止)
 http://s2net.s41.xrea.com/

ダウソの馬鹿どもがなんかやってるぞ、からかってやろうぜ!
strftime の "%Z" の表示のされ方はOS/言語による依存が激しいですか?

激しいとしたら、どこかにメジャーな OS、言語だけでいいので、一覧表のようなモノはあったりしますか?
277:03/12/09 20:07
じゃあ、あんまり使い道ないのかな?

registerのことは忘れます

どもでした
文字列へのポインタを返す関数の練習をしていて
ローカル変数またはテンポラリのアドレスを返します。
というワーニングを受けました。こういった使い方は避けるべきでしょうか。
char *gettime(void){
 char s[256];
 ...
 return s;
}
それでこちらの方法が推奨されるのかなと思いました。
int gettime(char *s){
 s="...";
 return 0;
}
関数の返り値では関数実行の成否を返すような使い方が好ましいのでしょうか。
>>28
>こういった使い方は避けるべきでしょうか。
やってはいけません。
gettime 関数を抜けると、s は破棄されます。

>それでこちらの方法が推奨されるのかなと思いました。
s = "..."; では無理です。
strcpy(s, "..."); です。

あと、s のサイズも一緒に渡して
バッファをオーバーしてしまわないようにするか、
推奨されるバッファサイズを #define して
バッファを確保するときにはそれを使って
サイズを指定するかという工夫が必要です。
このとき、\0 が必要であることを忘れずに。
30デフォルトの名無しさん:03/12/09 21:03
while内の途中経過をファイル名を変えて何個もデータ出力したいのですが
どうかいい方法を教えていただけないでしょうか?

FILE *outfile;
while(d<e)
{
d++;
a[i][j]= ;
b[i][j]= ;
c[i][j]= ;
}
outfile=fopen("detakekka50.txt","w+");
for(j=0; j<=m;j++) {
for(i=0; i<=n; i++) {
fprintf(outfile,"%15.5e,%15.5e,%15.5e\n",a[i],b[j],c[i][j]);
}
fprintf(outfile,"\n");
}
fclose(outfile);

detakekka01.txt  while 1回目のデータ
detakekka02.txt  while 2回目のデータ
こんな感じで出力したいのです。
今whileを抜けた最後の結果しか出せなくて困ってます。
どうか御願いします。
>29
疑問が氷解しました。
丁寧なご説明に感謝します。
>>30
char filename[256];
int count=0;
while(d<e)
{
代入
sprintf(filename,"detakekka%d.txt",++count);
outfile=fopen(filename,"w+");
書きこみ
fclose(outfile);
}
>>32
本当にありがとう御座います。
早速試してみます。
ありがとう。
34デフォルトの名無しさん:03/12/09 22:12
.c に関数定義を書いて .h にプロトタイプ宣言を書いた場合、
機能や引数、戻り値といったコメントは .c .h のどちらに書くものですか?
.h だと、ヘッダファイルがヘルプみたいになって便利かも。
36デフォルトの名無しさん:03/12/09 22:14
両方
わ、分かんない・・・。
.h にインターフェイスを簡潔に、.c に実装について簡潔に書くことにします。
>>35>>36 さん有難うございました。
>>34
両方。
39おご ◇yW.Ai2bcLY:03/12/09 22:31
ソースをキレイに書けばコメントはいらねー
コメントだけ書いてればソースなんていらねー
.h に書く意味は?

.c なら後で見るかもだが、.h に書いても見ないな
42求職中:03/12/09 22:45
こんばんわー。
書籍で 明解C言語を買ってきたのですが
コンパイルはソフト使わないとできないみたいなのですが
何かお勧めソフトってあるんでしょうか〜?
皆さん何つかってますか?
房な質問ですみません・・・
>>42
bcc32 ただ
cygwin の gcc ただ
>>42
gcc
bcc
LSI-C
好きな物使え。金はイランよ。
bccが初心者には手っ取り早いだろうね。
>>1以下を参照
>>19
>gccでみるかぎり、-O2つけるならregisterいらん。

またクルクルパーが一匹湧いて出たよ
やれやれ


>アセンブリ言語のソースまったく同じ。

と思ったが、こういう奴はOK
>>42
業種不問でおまいの知っている限りの「プロ」を列挙してみろ
そいつらは商売道具をどうしている?
↑クルクルパー
>>47
死ね
殺してみろ
何でこのスレって夜になるとバカが沸いてくるのだろうか。
なにをいまさら
>>47
おまえの頭がくるくるバ〜〜
53デフォルトの名無しさん:03/12/09 23:51
自分の理解が正解なのか不正解なのか
確認するための質問です。

int a[3][5];
で二重配列を宣言する。
その後、関数にaを渡し、
hoge(int (*a)[5]){...}
のように受け取ることにします。
その、
(*a)[5]
ですが
これの意味は、5つの要素を持つ配列を要素とする、
(3つの要素を持った)配列のアドレスですよね?

この理解は間違ってないですか?
○チかよ
55デフォルトの名無しさん:03/12/10 00:24
初心者です。よろしくおんがいマシ
---------------------------11111
-----01234------56789------01234
a[0][01234] [1][01234] [2][01234]
57デフォルトの名無しさん:03/12/10 03:35
main(){
  func();
}
void func(void){
  int *ptr;
  ptr = (int *)malloc(sizeof(int) * 10);
  ・・・
}

このプログラムでmallocで確保したメモリはfuncが
終了した時点で自動的に開放されるんでしょうか?
もし、開放されるなら、funcで確保したメモリは
freeする必要はないんでしょうか?
まぁ高々intが10個程度なら開放されよーがされまいが
どんと来い!
>>57
開放されたら困る。
あのな、解放だから。
>>57
まず、動的確保について勉強し直せ。
話はそれからだ。
62デフォルトの名無しさん:03/12/10 12:05
http://pc2.2ch.net/test/read.cgi/tech/1070469896/591です
宿題スレに誤爆してしまったので、改めてここで質問します。
unsignd int x = UINT_MAX; x++;
と桁あふれさせた時、0 になるというのは保証されているのでしょうか?
General protection faultが発生するのはメインメモリ不良も考えられますか?大方プログラムミスですか?
他のプログラムが頻繁に落ちるようならメインメモリ不良。
あんたのプログラムだけ落ちるようならプログラムミス。
6562:03/12/10 12:33
宿題スレの方に教えてもらって解決しました。
スレ汚しスマソ
>62
保証されてる
嘘つけ
ちょっとアイス食べてくるねw
またお前か!
70デフォルトの名無しさん:03/12/10 13:44
>67
保障されている。

JIS X30100-1993
(6.1.2.5 より)
符号なしオペランドを含む計算は、決してオーバフローしない。すなわち、格納する符号無し整数型で
表現できない結果は、その符合無し整数型で表現しうる最大値より1だけ大きい数を法とする剰余とする。

ISO/IEC 9899:1999
(6.5より)
A computation involving unsigned operands can never overflow, because a result that cannot be
represented by the resulting unsigned integer type is reduced modulo the number that is one
greater than the largest value that can be represented by the resulting type
7167:03/12/10 14:03
signed が未定義だったんでてっきり unsigned もそうかと。
スマン
72デフォルトの名無しさん:03/12/10 15:35
Cのポインタが難しすぎて全然意味分からん、とかぐだぐだ
言っている奴が最近周りで多いんだが何故だ?ポインタについて簡単に
語ってやると、ただのメモリアドレスだろ、たったそれだけ。そりゃあ漏れだって
はじめの頃はさっぱり分からなかったが、Cを語る上では
最低限の知識だからな。でもまあ、C厨の漏れが言うのも何だが、
高級言語に分類されている割には全然使えねー糞言語だな(プゲラ
73デフォルトの名無しさん:03/12/10 15:40
(プゲラ
74デフォルトの名無しさん:03/12/10 15:45
数字の配列があって、
配列全体で i 番目に大きい数字は、配列の何番目にあるのかを知りたいのですが、
どうすればいいですか?
ソートしてi番目の値を見る
76デフォルトの名無しさん:03/12/10 15:50
ソートしてしまったら、何番目にあるかという情報がなくなってしまう気がするんですが?
ワロタ
少しは自分でも考えてみたら?
ソートしてi番目の値が元の配列の何番目にあるかを見ろ。
7974:03/12/10 15:56
a[0]=10
a[1]=2
a[2]=8
a[3]=6
a[4]=9
a[5]=5
例えばこのような配列があって、2番目に大きい数字は?と聞かれたら、
9なので「4」という値を返してほしいんですが(´・ω・`)
数値と番号を構造体にまとめてソートしたら?
>>74
だから少しは自分で考えろって言ってんだろうが。
宿題だったら他スレ行け。
>>81
答えたくないなら放置しろよ
ちゅーか、回答出てるし。
ちゅーちゅーちゅーずでーい
>>72
>高級言語に分類されている割には
そう分類する莫迦が増えた、ということです。
86デフォルトの名無しさん:03/12/10 16:14
初心者で申し訳ありませんが
stristrが必要なんですが
何所かに参考に出来るソースはないでしょうか?
違うんだ、あれは縦読みなんだーーーーーー
>>86
まずstrstr作ってみたら?
8986:03/12/10 16:29
検索してたら見つかりました。
ttp://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip2b.htm

>>88 れすどうも。 バグが入りそうなので参考を元に作ってみます。
最悪、両方を toupper か tolower で変換して strstr 掛けるって手もあるな。
>>90
むしろそっちの方が速いでしょう。
メモリは余計に喰うけど。
気付かれない縦読みは哀れ
えーん
リスト構造の実行テストって、どうやればいいかな
今頃・・<<1おつ〜
便乗で質問です。
自己参照構造体があったとして、
struct list{
struct list *next;
char *word;
}
で、char型のポインタを参照する場合は、
アロー演算子で、p->wordとするのはわかるんですけど、
これって、wordの指す先頭アドレスを表すのですよね。
もし、wordの指す領域を一文字ずつ処理したいときとかには
どのように表せばよいのでしょうか?
p->*wordとか、いろいろ試したのですが、駄目でした。
>>96
p->word[0]='a';  p->word[1]='b'; 又は
*(p->word)='a';  *(p->word +1)='b'; 
*(p->word)='a';


氏ね
>>98
氏ねは言い過ぎだろう。
確かに括弧はいらないが。
ごめん、ツリー構造だった

実行テストいい方法ない?
>>100
イテレータ
>>74
元の配列をA、Aをコピーした配列をBとする。
Bを大きい順にソートし、i番目に大きい数値(これをcとする)を探す。
cをAの中から探し、その添え字を取得する。

これでどうかな。
103デフォルトの名無しさん:03/12/11 12:27
>>100
printf
104デフォルトの名無しさん:03/12/11 14:54
stdio.hの中に含まれてる、関数mallocって実際にはどういうソースコードなのですか?
API呼んでメモリ使って良いよって許可もらってくる関数
106デフォルトの名無しさん:03/12/11 14:58
間違えた、stdlib.hだった。スマソ、逝ってきまつ
107デフォルトの名無しくん:03/12/11 17:06
string.hだろうが
















(うそだよ)stdlib.hだよ
108デフォルトの名無しさん:03/12/11 17:21
#include<stdio.h>
void increment ( int * p ){( * p ) ++ ;}
main(){int a=10;increment(&a);printf("%d",a);}

#include<stdio.h>
int increment ( int a ){ ( a ) ++ ;}
main(){int a=10;a=increment(a);printf("%d",a);}

どっちでもいいですか?
実行すれば上じゃないといけないことくらいすぐ分かるだろう。
110デフォルトの名無しさん:03/12/11 17:23
>>109
パソコンがないので実行できないのです(携帯から書き込みました)。
>109
コンパイルするだけで分かるんじゃないか?
下はreturn a;を忘れとるな。
>>112
あぁ、変だと思ったらそういうことか。
return a + 1; なら OK だね。
114デフォルトの名無しさん:03/12/11 17:36
ポインタの意味がどうにも理解でけへんねんけど
115デフォルトの名無しさん:03/12/11 17:39
そか
116>>113:03/12/11 17:40
>>114
どこらへんが分からんの?言うてみ
118デフォルトの名無しさん:03/12/11 17:42
ファイルを消すにはremoveを使えばよいということが分かったですが、作り方がわかりません。
どうすればいいですか。
>>119
> その名前によるアクセスを不可能する。
名前だけ削除してファイルそのものは削除しないこともあるからな(ハードリンクをはっていたりして)。
>>118
fopen(filename, "w");
「変数=箱」モデルに従うと、
変数は箱(メモリのどこかに用意した領域)。
ポインタは箱の「場所」(領域のアドレス)を入れとく箱。

int i, j; /* iとjという名前の箱。整数だけ入れていい */
int *p; /* pという名前の箱。整数を入れていい箱の「場所」だけ入れていい */

/* &iはiの「場所」を得る式 */

p = &i; /* 箱iの「場所」を箱pに入れる */

/* *pはpに入ってる「場所」にある箱の中身 */

j = *p; /* 箱pに入ってる「場所」にある箱の中身を箱jに入れる */
123デフォルトの名無しさん:03/12/11 18:00
>>121
できました。
fopenは開くだけでなく作ることも出来るんですね。
ありがとうございました。
>>122
> /* &iはiの「場所」を得る式 */
式ではなく単項演算子です。
↑& だけじゃなくて &i だっての
&iのどこが単項演算子に見えるんだ?
127126:03/12/11 18:12
かぶった死のう
安藤愛
>>128
トモダチ!!!
Cプログラマ必読の本を買うタイミングは?!
プログラミングをやってけるという自信がついた時 、でよいですか   ?
今時C言語なんて人気ないよ。
HSPとかjavaに早いうちに乗り換えた方が基地
にならずに済むよ。
>>124
無知がツッコミ入れて玉砕(´,_ゝ`)プッ
135114:03/12/11 18:29
喧嘩しないで(TДT)
ポインタは乗算できないということだけ覚えておけばいいよ(^-^=)
乗算する必要なんてある?
138デフォルトの名無しさん:03/12/11 18:50
int a[10];として、a[10]のアドレス(11以上はダメ)を得るのはOKだけど、そこにアクセス(a[10]=8;とか)してはいけないということでよい?
皆無
>>138
まぁ、一応。
C++ のアルゴリズムを使うときには
そういうアドレスをとることもあるけど、
でも基本的にはそういうアドレスは
なるべく取らない方がいいと思う。
>>140
> なるべく取らない方がいいと思う。
意味不明。
a[1000] のアドレスを求めるだけなら、a + 1000 で済むし。
143デフォルトの名無しさん:03/12/11 19:05
10
9
8




↑のような数字が10行あるファイルを読み込んで、それを配列に1つずつ入れたいんですけど
(int File[10])、なんかエラーがでます。
File[0]には10が入って、File[1]には9が入っているようにしたいんです。
エラーの内容やコードを書かないのはネタだからですか?
わざとですか?
何故ネタにマジレスしてるのですか?
146143:03/12/11 19:08
あ、fscanfの最後の変数に&を付け忘れていただけでした。
147143:03/12/11 19:08
わざとだからです。
148 :03/12/11 19:21
ここのクズ回答者すぐ気に入らない質問者を騙るな。
ナにがしたんだ?邪魔だから死ねよ
>>148
HSPスレに帰れ
今日作ったハンバーグは熱伝導率が悪い。
何故だろう。
>>150
printfデバッグしてみたら?
バグじゃないし
>>151
おお、その手があったか。ありがとやってみるよ
154_:03/12/11 19:32
はじめて投稿します。
プログラム暦3ヶ月のものです。
C言語を利用して、FTP転送プログラムを書こうと思いますが、
難しいでしょうか?
市販のDLLのソフトを買ったほうがよいでしょうか。
皆さん返答お願いします。
プログラム暦三ヶ月といっても能力の個人差は計り知れない。
よって、自分で取り組んでみて、難しいかどうか判断しろ。
FFFTP は確かオープンソースだったから
いろいろ参考にできるかも...。
>>154
買ったほうが「よい」とは何のことを言っている?
単にファイル転送ができればいいんならコマンドプロンプトからftpとたたけ。
常時接続なら金は1円もかからん。
自分で書くなら本を買ったりコンパイラを買ったりは序の口
勉強やら作業工数を時給換算すると車が買えるほどの金になるぞ。

おまいは家が買えるほどの儲けを狙う大博打を
打つべきか否かをこんなとこで人に聞いているわけだ。

俺は笑わないでやるが...
はいはい。
159デフォルトの名無しさん:03/12/11 22:43
11行目でエラーでるのですが直してください

#include <stdio.h>

/* 複利計算 */
int main(int argc, int *argv[])
{
float nenri, i, money;

if (argc == 0 | argc > 2)
printf("usage: fukuri 金額 年利\n");

money = argv[1];
for (i = 1; i = 10; i++) {
nenri = argv[2] / 100;
money = nenri * money;
printf("%d年 %d円\n", i, money);
}

return 0;
}
161デフォルトの名無しさん:03/12/11 23:01
たとえば、printf("%4d", n)では4文字として
文字幅を指定すていますが、これを動的に指定することはできる?
はい。
いいえ。
>>160 まちがいだらけ。
12,13行目でエラーで増す直してください

include <stdio.h>

/* 複利計算 */
int main(int argc, char *argv[]) {

int i;
float nenri, money;

if (argc == 0 | argc > 2)
printf("usage: fukuri 金額 年利\n");

money = &argv[1];
nenri = 1 + argv[2] / 100;
for (i = 1; i = 10; i++) {
money = nenri * money;
printf("%d年 %d円\n", i, money);
}

return 0;
}
>>164
>160はネタ
ねたじゃありませんです
168161:03/12/11 23:10
>>162
教えてー
俺に聞けというタイトルはネタだったのか?
>>168 printf("%*d", m, n)
171デフォルトの名無しさん:03/12/11 23:16
char *p;

p = (char *)malloc(sizeof(char *) * 0);

このコードで割り当てられるメモリの量は0バイトにも関わらず
p にはアドレスが返されます。この返されたアドレスをfree()し
ても問題ないでしょうか?
ちなみにgccでのコンパイルは通りましたし、実行も出来ました。
172161:03/12/11 23:19
>>170
できました!! ありがとー!
173貧乏紙:03/12/11 23:22
やっと「私」から「俺」になったか・・・
174デフォルトの名無しさん:03/12/11 23:27
>>171
C FAQより

11.26:

malloc(0)は、どういう動作をすべきなのか。ヌルポインターを返す のか、0バイトの領域を指すポインターを返すのか。

A:

ANSI/ISO規格にはどちらでもかまわないと書いてある。動作は実装依 存(質問11.33参照)である。

References:
ANSI Sec. 4.10.3; ISO Sec. 7.10.3; PCS Sec. 16.1 p. 386.
strtok_rの使いかたがよくわからないのですが
char *strtok_r(char *s, const char *delim, char **ptrptr);
176デフォルトの名無しさん:03/12/12 00:23
>>175
標準ではないことは・・・だけどまあいいか。
strtokの使い方は分かっているの?
>>160 はネタとしても
>>164 はネタじゃない。
178デフォルトの名無しさん:03/12/12 01:15
「strlen関数をループ文を使わずに実装せよ」という気になる
一文が Software People vol.3 というムックにありました。
どなたか実装方法分かる方おられますか?
私自身、無理っぽい気がしています。
goto でループを作るというのはすぐ思いついたのですが、
違う気がしています。
そんなもん再帰関数でちょちょいのちょいじゃん。
180デフォルトの名無しさん:03/12/12 01:30
int strlen(char *s)
{
return sprintf(s, "%s", s);
}
181デフォルトの名無しさん:03/12/12 01:31
あ、確かにそうですね。ありがと。
再帰関数が正解ですね。
int strlen(char const * s) {return strchr(s, '\0') - s;}
184171:03/12/12 04:57
>>174
実装によりけり、となるとmalloc(0)やfree()は
行わないのがよろしいみたいですね。
ご助言、感謝します。
>>178
int mystrlen(char *s){return *s?mystrlen(s+1)+1:0;}
186デフォルトの名無しさん:03/12/12 08:39

★★★★★常時接続の方におすすめビジネス★★★★★

1日二時間ネットを利用する人だと1ヶ月20000円は稼げます。

ネットサーフィン中に広告バナーを表示させているけでお金になります。
ネットサーフィンだけでなくワープロソフトやホームページビルダーなどを使って
お仕事していてもバナーを表示させていれば課金されます。
広告バーの使用時間は無制限。極端なことを言えば、1日24時間稼動させてもOK。

紹介制度も8段階あり頑張れば1ヶ月50万以上も可能です。もちろん登録も無料。
今までクリック保証のビジネスやメール受信をしましたがこれが一番お金になりました。

英語が苦手な方もホームペーシに解り易く登録方法を載せましたので登録できると思います。
ぜひ登録してみてください。確実に稼げます。

http://www.hamq.jp/i.cfm?i=cashfiesta
質問があります。

以下のコードを実行してもベルがならないのですけど、
どうすれば鳴るようになるでしょうか?

#include <stdio.h>

int main(void)
{
  printf("%a");

  return 0;
}
printf("\a");
C FAQの 3.8にある
直前の副作用完了点と次の副作用完了点までの間に、
式の評価によってオブジェクトに格納された値を
変更する回数は高々一度だけでなければならない。
とは、
f(a=1,a=1);

a=a=1;
は、
だめよってことですか?
190デフォルトの名無しさん:03/12/12 12:28
1×1の正方形があります。それに内接する形で0.5×0.5の円が
あります。乱数の生成は0以上1未満とし、円の中にのみ入るX,Y座標
を求めたい場合どのようなプログラムにする必要がありますか?
円上は含めて構いません。
他のとこにも聞いてしまいましたがよろしくお願いします。
>>190

inline double rand01() // 0以上1未満の乱数生成
{
 return rand() / (RND_MAX + 1.0);
}

x = rand01();
y = rand01();
// ↑本当は独立した乱数を2つ用意したほうがいいんだけど、
//  面倒なら同じrand関数を使ってでもいいや。

abs = sqrt(x * x + y * y);

if(abs <= 1) // ←円の中
else      // ←外
192デフォルトの名無しさん:03/12/12 14:20
ファイルよりm次の正方行列を二次元配列に格納しました。
もとの正方行列をn次の正方行列(m>n)で区切り、
そのn次の行列の成分を全て足したものを成分とする(m/n)次の正方行列を作りたいです。
どうかよろしくお願いします。
宿題は宿題スレへ。
>>193
すみません。移動します。
この手のってC言語っていうかアルゴリズムに
よるところの方が大きいよね・・・
>>191
ありがとうございます!がんばってみます!
>>191
あーっと,すいません.sqrtって関数ですよね?!
>>197
平 方 根
void
ExecCmd (char *Cmd)
{
sprintf (CmdBuffer, "%s %s %s", Cmd, OutFName, InFName);

system (CmdBuffer);
}
があって、
MainFunction (char FuncMode, int FTypeRet, char *InFName, char *OutFName)
内で、
ExecCmd ("tar czvf");
を実行しました。
しかし、ExecCmd()の、sprintf()の次の行で、printfをつかってOutFName,InFNameを調べると、何故かそれが空になっています。
MainFunctio内の、ExecCmd()を実行する前では、きちんとOutFName,InFNameが、表示されます。

どうすればいいですか?
ExecCmd (char *Cmd,char *InFName, char *OutFName)
にすればいいのかも知れないけど、(試してない)
それだと面倒です。ちなみに、
static char InFName[100], OutFName[100], CmdBuffer[512];
です。
> static char InFName[100], OutFName[100], CmdBuffer[512];
MainFunctionの中で宣言したら、ExecCmdの中では使えないぞ。
>>200
ありがとうございます。

ExecCmd,MainFunctionは、func.cにあって、func.cでincludeしているfunc.hで static char InFName[100], OutFName[100], CmdBuffer[512]; としています。
質問が不明確ですみませんでした。
MainFunction (char FuncMode, int FTypeRet, char *InFName, char *OutFName)
->
MainFunction (char FuncMode, int FTypeRet, char *xInFName, char *xOutFName)
>>202
ありがとうございます。ただ、普通にauto型にしたら、逝けることを>>202見る前に気づきました。どちらが良いのでしょうか?
scanf()は、おかしなものが入力されたときに暴走する可能性があるから
gets(x);
atoi(x);
のようにするじゃないですか。
scanf("%d%d",&a,&b);
のように2つ同時に読みこむときに暴走しないようにするにはどうしたら
いいんですか?
戻り値を確認する
fgets+sscanf
getsじゃなくfgetsを使うメリットはあるのでしょうか?
バッファオーバーラン防止
改行文字も読んでもらえる
昔の VC++ は言葉通り「暴走」した記憶があるなぁ。scanf 。
>>210はこんなことをしていました。

int a;
scanf("%d",a);
>>204
scanfに何が不足しているって言うんだ?
具体的に何ができればよかったのか言ってみな
>>211
こういうことだよ。

int a;
printf("> ");
scanf("%d", &a);

実際の入力
> k
#include<stdio.h>
main()
{
int sum,n;
n=10;
sum=0;
while(n){
sum = sum + (n--) ; /* この行 */
printf("%d:%d\n",sum,n);
}
}




「n--」の場合と「n=n-1(またはn-=1、または--n)」の場合で動作が違います。
後者の動作の方が理屈通りだと思います。
なぜでしょうか?謎ですのでヒントください
215デフォルトの名無しさん:03/12/13 11:28
>>213晒しage
216デフォルトの名無しさん:03/12/13 11:30
メモリの初期化方法

memset() でメモリを初期化でするためには、
どの書き方が適当でしょうか?

--------------------
#define NULL 0x00

p = (TABLE *)mallloc( sizeof(TABLE) );

(1) memset(p, 0x00, sizeof(TABLE));
(2) memset(p, '\0', sizeof(TABLE));
(3) memset(p, NULL, sizeof(TABLE));

calloc使えよ
218デフォルトの名無しさん:03/12/13 11:50
scanfもうちょっとどうにかならんのか
書式に従って値を格納するだけなのになんで暴走するんだ。
どれも間違いだよ
220デフォルトの名無しさん:03/12/13 11:55
>#define NULL 0x00
とりあえず、これはやめれ
#define NULL 0ull
222デフォルトの名無しさん:03/12/13 12:10
つぎのようなプログラムを作成しなさい。
1.構造体 struct gstudentを宣言する。
2.struct gstudent 型の変数(オブジェクト)saoriを定義する。
3.struct gstudent 型の変数(オブジェクト)kaoriを定義し、
  そのメンバーを"kaori", 161, 50.0, 70000で初期化する。
4.struct gstudent へのポインタ変数pを定義し、saoriを指すように初期化
  する。
5.saoriにkaoriを代入する。
6.saoriのnameメンバーを"Saori"に変更する。
7. saoriのnameメンバーを表示する。
8.saoriのheightメンバーを表示する。
9.pの指すオブジェクトのnameメンバーを表示する。
10.pがkaoriを指すようにする。
11.pの指すオブジェクトのnameメンバーを表示する。

途中までは出来たのですが、先がわかならいので
教えてください、お願いします!


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

struct gstudent {
char name[20];
int height;
float weight;
long schols;
};
先がわかならいのは分かったから、↓に行け。

C/C++の宿題を必殺仕事人始末人 17代目
http://pc2.2ch.net/test/read.cgi/tech/1070469896/
>>218
暴走なんかしてないよ
scanfはちゃんとエラーを返してる
おまいのコードがそれを無視または検出に失敗
もしくは検出後の処理が不適切なだけだ
>>214
まずはデクリメントをきちんと調べてみれ
>>224
ぢゃ聞くけど、もまえは文字'k'を読みとばすために具体的にどうした?
scanf以外を使うだろ?
だからscanf使えん、っちゅーこった。ぱんなこった。
scanfが暴走したことなど一度もない。
>>226
scanfの使い方を知らないお前がバカ。
>>212
scanfは、まちがった入力したときに
それをバッファにおいてくるので
while文でつかったときに無限ループになる
ところとかが困ります。
>229
scanfは仕様どおりに動作している。
printfなんかと違ってscanfは高機能だから初心者には使いこなすことができない。
>>229
それって何?指示語の使い方おかしいよ。
232デフォルトの名無しさん:03/12/13 14:30
ポインタについて質問なんだけど

*buf++;
buf++;

の移動は同じ?
>>232
よくわからんが
*buf++は
*(buf++)だな。
>>226
普通に scanf("%*[k]"); じゃあかんの?
Borland C++ Compiler 5.5.1で本を利用してCを勉強しているのですが、
main関数に引数を渡す方法についての部分で、
「コマンドラインから入力した引数を、そのまま画面に出力するプログラムを
作成してださい。」という例題があって、
#include <stdio.h>
int main(int argc, char *argv[])
{
if ( argc != 3) {
printf("引数の数が間違っています\n");
return 0;
}
printf("%s %s\n", argv[1], argv[2]);
return 0;
}
上記のようにコーディングして、コンパイルをすることはできるんですが、
本で指示されているようにコマンドラインに ./a.out hello taro と入力しても
コマンドまたはファイル名が違います。と表示されてしまいhello taroが
表示できません。どうすれば表示できるのでしょうか、教えてください。
よろしくお願いします。
どこもミスは無いようなので、漏れならこうする。
エラー覚悟で argv[1], argv[2] を出力して何が入ってるか確かめてみる。
できた実行ファイル名が a.out じゃないに 1000 ペリカ
238236:03/12/13 14:58
あ、もしかして a.exe じゃないと駄目とか?
BCCやったことないんで分からん・・・。
236は天才
>Borland C++ Compiler 5.5.1
は a.out を知っているのか?
./a.out ってなんじゃらほい。
ウィルス。
ファンデンホーヘンバンド
ぐぐれ
>>235
Hello Worldはやってみたのかな。
どうやって実行したのかな。
echo hello,would!
Hello World
コマンドまたはファイル名が違います。と表示されてしまいます。
すみません、例題の内容が把握できてなくて実行方法を間違っていました。
さっきまではコンパイルしたあと通常のようにファイル名だけを入力して実行
していました。
>>245さんの書きこみでやっとアホすぎる間違いというか根本的な問題に
気づいてファイル名 hello taro と入力したらキチンと表示されました。
ありがとうございました。
その他のみなさま、あまりにも初歩的な質問すぎて混乱させてしまい申し訳
ありませんでした。
↑作る事が出来て良かったね。
漏れが初めてhello,would出した時は、今じゃ味わえないくらい感動したもの。
うまれてから一度も出したことないな。
>hello,would
意味深だな
ちょっと待って、would って world だったのか!
あほだ・・・、漏れ。こんなとこで低脳っぷりが露呈したー
あまりにもひどい
極みだ。
>>226
おいおい、scanf以外の関数を使ったからって
scanfが使えない理由にはならないだろう
もしやprintfについても同じ考えか?

>>229
おおかた!=EOF程度の判定しかしてないからだろ

>>230
そんなことを言うとまともな初心者に失礼だぜ
どうせ何を使わせてもロクなことをしないアフォと一緒にしないでやれ
256またかよ:03/12/13 16:30
scanf,scanfって何度もしつこいな
他に無いのか?
restrictポインタァ
char s1[restrict], char s2[restrict]
char *strcpy(char * restrict s1, const char * restrict s2); だってさ。
カコイイ
>>255
いや、私は使いこなせないと思うな。
使いこなせるなら充分初心者卒業だよ。
#使うことができないと言ってない点に注目。
>>260
scanfであろうが何であろうが
まず仕様をよく理解するのが基本だろうが

規格票のいい加減な斜め読みと
(規格票なんて持ってないに1000モナス)
これまた同質な感情論の受け売りで
いちいち妙なバイアスかかるアフォは
間違いなく筋(素地?)わるい

あまつさえ、たかがscanfでこの程度じゃ
先が思いやられるだろ
て言うか、scanf なんかわざわざ規格調べて使うほどのもんじゃないだろ。
scanfは入力されるものがはっきりわかってるのなら十分使える。
手入力には100MB分のテキスト打って1つもtypoしない香具師しかおすすめしない。

まぁC言語 標準関数一覧知ってる脱初心者ならstdio.hのみ(scanf系不可)でなんとかしなさいってこった
>>263
標準関数ってどこまでよと。
て言うかそんな丸暗記試験で初心者から脱出できるのかと。
>>263
strok()とか平気な顔で使ったりするんだろうなぁと思った。
266!263:03/12/13 19:26
>>264
> 標準関数ってどこまでよと。

マジでそんなこと聞いているの?
>>266
知ってるなら罵倒と共に答えを書いて私をこてんぱんにすれば良いだけの話。
そんな回りくどいか帰庫をすると言うことはあなたもまた知らないんですね。
268!263:03/12/13 19:30
>>267
http://www.bohyoh.com/CandCPP/C/Library/index.html

ほんの少し不足しているけれど、これでも見ておけば。
文字列OK
>>263
scanfは誤りの存在と位置を教えてくれる
それが適切に処理できないことの自己弁護は
やる気と向上心のなさを如実に示す兆候だ
いい加減にされるがいい
>>268
必死で探したんですね。ご苦労様です。
272デフォルトの名無しさん:03/12/13 21:14
scanfでEOFになったら、その次どうすればいいんだ。
もう一回scanfしても、同じとこで失敗して無限ループになる…

一般的でキレイな解決法きぼん。
273デフォルトの名無しさん:03/12/13 21:19
>>272
3回NG出したらアクセス規制
>>272
一般的な方法など無い。

キーボードからの入力で改行まで読み飛ばすことがふさわしい場合には、
scanf("%*[^\n]\n");
で、改行文字までを捨てることができる。
275nam:03/12/13 21:21
画像や音声ファイルなどを実行ファイルに一まとめにしたいのですが、
どうすれば良いでしょうか?

C言語、gccですが、Makefileなどで何かすればよいのでしょうか?
リンクするとき*.oと一緒にリンクするのですかね?
276デフォルトの名無しさん:03/12/13 21:28
>>275
char配列などに格納。

unsigned char image[]={0x9A,0xAC,・・・・・,0x67};
277nam:03/12/13 21:38
ネタは無用。
マジレスしてくれる方だけレスしてください。
>>276
だから、コテハンは無視しておけってあれだけ言っておいたのに...
279272:03/12/13 21:58
>>274
ありがと。
マニュアルみても書式の意味がサパーリだったけど、
それみてちょっとだけ分かった…
そのマニュアルが HTML なら、
このスクリプトを実行してみると
何となく分かりやすくなる気がするかも!?
JavaScript:document.body.innerHTML=document.body.innerHTML.split('。').join('にょ。');focus();
漏れ古いネスケ
>>272
とりあえずEOFが何の頭文字か調べてみたら?
scanfの戻りがEOFでない場合の意味もどうやら知らないようだな
>>282
ええ女とFuck!
>>283
その通り。
分かっているなら>>272は明らかにおかしいと思わないか?
285デフォルトの名無しさん:03/12/13 22:35
>>282
EOFの意味ぐらい知ってるわい。
でもそんなこと言ったって、変換に失敗したらEOFが返るってかいてあるじゃん。

…書いてなかった。すまん。
scanf って変換に成功した個数が返ってくるんじゃ?
いつまで引っ張るおつもりで?
質問です

int main() {
 printf("sum = %d\n", sumVer(4, 45, 45, 12, 45, 5.67));
 return 0;
}

int sumVer(int n, ...) {
 char *ap;
 int sum, i;
 ap = (char *)&n + sizeof(char *);
 for(i = sum = 0;i < n;i ++) {
  sum += (int)*ap;
  ap += sizeof(char *);
 }
 printf("%f\n", (float)*ap);
 return sum;
}

これで第二引数から第五引数までの合計は得られるんですが
5.67が表示されません
どこが悪いんでしょうか・・・?
289デフォルトの名無しさん:03/12/13 23:12
>>288
変なことをせずにstdargを使え
290289:03/12/13 23:13
それに5.67はdoubleだ。
そこをなんとかなりませんかねえ・・?

ap = (char *)(&n + sizeof(int));
でした
va_list, va_arg, va_end を使うか、
配列にして渡すか、だな。
そうしない奴は死刑。
293デフォルトの名無しさん:03/12/13 23:22
>>291
>>290が読めないのか?

> printf("%f\n", (float)*ap);
floatじゃなくてdoubleだと言っているんだよ
まあたとえ5.67Fにしてもこの場合はdoubleが渡るがな。
(〜´Д`)〜 >>292に処される〜
295293:03/12/13 23:23
ちょっと違うか。
*(double)ap;
こうだこう。
296293:03/12/13 23:23
おっと、*(double *)ap;
素直にva_arg〜使います(´・ω・`)

お騒がせしました
>>291
第二引数から第五引数までの値も、たまたま取れただけだろ。
ビッグエンディアンの環境や128以上の値を渡した場合とか
すぐに破綻する。
stdargを使え。
無茶するならこうか?
多分うまくゆかないと思うけど。

int sumVer(int n, ...) {
 char *ap;
 int sum, i;
 ap += sizeof(n);
 for(i = sum = 0;i < n;i ++) {
  sum += *(int *)ap;
  ap += sizeof(int);
 }
 printf("%f\n", *(double *)ap);
 return sum;
}
300デフォルトの名無しさん:03/12/13 23:31
この場合、正しいと思われるコード

int main() {
printf("%lf\n",5.67);
 printf("sum = %d\n", 45 + 45 + 12 + 45);
 return 0;
}

可変長引数を取る関数は初心者が思ったほどには使えない。
普通に書け普通に。
301299:03/12/13 23:31
あ、char *ap;はchar *ap=(char *)&n;
>>300
printfに%lfはないよ
303デフォルトの名無しさん:03/12/13 23:36
え゛。うちの環境はこれで動いてるが…ヘンなのか。
>>302
あります。
>>303=>>300?
独自に追加しているだけじゃない?%sにNULLを渡すと(null)と表示するみたいに。
可変個の場合、floatはdoubleに格上げされて渡されるから、floatもdoubleも%fで受ける(long doubleは%Lfで)
%lfは規格ではちゃんと未定義
307デフォルトの名無しさん:03/12/13 23:46
>>305-306
知らんかった。
_| ̄|○
可変長引数より配列だな。
>>308
何の為の可変長引数だと思ってるの?
>>309
288のことじゃないの?
311デフォルトの名無しさん:03/12/13 23:53
288は別に足し算がしたいんじゃなくて、
可変長引数の関数の勉強がしたかったんだろうと思ってみる。
それならstdargを使いそうなものだけどなぁ。
もっと内部的な仕組みを勉強したかったのかしら。
int main(void)
{
int *p, q;

p = &q;
*p = 100;

printf("adp %p, value %d,,, adq %p, value %d,,,", p, p, q, q);
return 0;
}

質問があります。
教科書(独習)によると、qのアドレスと、pの値は同値のハズですが、まったく違う数になりました。
結果はこうです。

adp 0012FEC8, value 1244872,,, adq 00000064, value 100,,,

何故でしょう・・・16進と10進で違う事を加味しても、おかしいです・・・・
p, *p, &q, q
315デフォルトの名無しさん:03/12/14 00:08
>>313
printf("adp %p, value %d,,, adq %p, value %d,,,", p, *p, &q, q);

こうでしょ。
316sage:03/12/14 00:08
printf文が間違ってる。
...",p,*p,&q,q ) でなきゃ。
317sage:03/12/14 00:09
うあ。
重婚罪!
319313:03/12/14 00:34
うあ。3重婚・・・・

ありがとうございます。
あれ?
adp 0012FEC8, value 100,,, adq 0012FEC8, value 100,,
になりました。

何故?やっぱりおかしい・・・・
pの値とqのアドレスが一致しません・・・なんかおかしい。
adp 0012FEC8
adq 0012FEC8
俺には一致しているように見えるけどな。
if(p==&q)
printf("同じじゃん!\n");
どうしても信じられないならこうしてみれば。
>>319
ポインタの章をもう一度読み直した方が良いと思う。
>>322
319はただのうっかりさん。
p の値 = p = 0012FEC8
p の参照先 = *p = 100
q のアドレス = &q = 0012FEC8 = p
q の値 = q = 100 = *p
325313:03/12/14 00:50
adp 0012FEC8, value 100,,, adq 00000064, value 100,,,

printf("adp %p, value %d,,, adq %p, value %d,,,", p, *p, q, q);

これで納得しました。
16進64 == 10進100 イイ!!
なんか完璧に否定してるな。今までのレスをさ。
(・∀・)イイ!!ものは(・∀・)イイ!!
よって
(・∀・)イイ!!ものは(・∀・)イイ!!
328323:03/12/14 00:56
やっぱり322の言うとおりにしとけ。
329313:03/12/14 01:02
その方がいいみたいですね・・・すいません。
330デフォルトの名無しさん:03/12/14 01:10
コンソールに情報を出力するとき、スクロールしないでリフレッシュするように
するにはどうしたらいいの?
>>330
system("clear");とかsystem("cls");とか。
332313:03/12/14 01:27
鬼のように理解出来ました。
%pの使い方と効果を鬼のように勘違いしてました・・・スンマソン
333デフォルトの名無しさん:03/12/14 01:29
>>331
( ´,_ゝ`)プッ
>>288

>char *ap;
^^^^
アフォ

これをちゃんとクリアするまでstdargだの格上げだのという次元ではない。
教科書のページを戻せ、もっと基本的なことの復習が必要だ。
>>334
お前は人間としての社会性を勉強すべきだ。
>>335=288?
見苦しいから脊椎反射レスするなよ。
>>336
はいはい。せっかく晴れてるんだから若者集まる繁華街にでも繰り出したらどうだ?
できない場合はその理由を教えて下さい。
仮面ライダーZO(ゼットオー)ってのは二十(20)周年を記念して企画されたんだよん。
んでZOの一つ手前の作品が真・仮面ライダーね。あのキモいの。
>>334
ap = (char *)&n + sizeof(char *);
これの二つ目のchar *や
ap += sizeof(char *);
これのchar *にアフォと言うなら話は分かるが・・・
日下部がなんで茶になるんだよ
# 犬とならまだしも
int main() {
 printf("sum = %d\n", sumVer(4, 45, 45, 12, 45, 5.67));
 return 0;
}

int sumVer(int n, ...) {
 int *ap = &n + 1;
 int sum = 0;
 int i;
 for(i = 0; i < n; ++i) {
  sum += ap[i];
 }
 printf("%f\n", *(double*)&ap[n]);
}
>>340
stdarg.h を読んでみろ。
int, double のデータ構造を混同するスレはここですか?
誰か混同しているか?
↑ネタだよな。
うちではva_listはchar *
>>345
そもそも「データ構造」に関する書き込みをしている人はいないし。
はー、恐ろしかスレですね。
>>341だよ、混同してるのは。
349341:03/12/14 12:02
return sum; 忘れてたよ。
*(type*)& 使ったこと無い厨房のいるスレはここですか?
351デフォルトの名無しさん:03/12/14 12:06
しょぼい煽り。
>>348
よく見なさい。sumVer の第一実引数は 5 ではなく 4 だ。
353デフォルトの名無しさん:03/12/14 12:19
見るにたえんスレだなw
そう言いつつも書き込んでしまう>>353であった。
遅レスだが、>>313

 printf("adp %p, value %d,,, adq %p, value %d,,,", &p, p, &q, q);

としたかったのでは?
int *p, q;

で、p も q も両方ポインタ変数になると勘違いってことか?
>>355-356
本気で言ってるのか?
358356:03/12/14 14:28
>>357

以下、356 を書き込んだあとに書き込もうとしたが、
さらにスレを汚すのはイクナイので、やめた文章。

> ごめんなさい。ごめんなさい。ゆるしてください。わすれてください。逝ってきます。
ふとおもったが
char ********a;
char *******b;
char ******c;
char *****d;
char ****e;
char ***f;
char **g;
char *h;
char i;

a = &b
b = &c
c = &d
d = &e
e = &f
f = &g
g = &h
h = &i

って可能なの?
可能ならどこまでできるのかしら
>>359
自分で確かめてみたら?

/* 359.c */
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char **argv) {
  int c,i,j;
  if((argc!=2)||(c=atoi(argv[1]))<1)exit(1);
  printf("#include<stdio.h>\nint main(void){\n\tchar a0='X';\n");
  for(i=1;i<c;i++) {
    printf("\tchar ");
    for(j=0;j<i;j++) printf("*");
    printf("a%d;\n",i);
  }
  for(i=1;i<c;i++)printf("\ta%d=&a%d;\n",i,i-1);
  printf("\tprintf(\"%%c\\n\",");
  for(i=1;i<c;i++)printf("*");
  printf("a%d);\n\treturn 0;\n}\n",c-1);
  return 0;
}

使い方(4つの変数を使う場合):
> 359 4
361360:03/12/14 15:31
> 359 4

と実行すると、次のようなプログラムを吐くので、

#include<stdio.h>
int main(void){
  char a0='X';
  char *a1;
  char **a2;
  char ***a3;
  a1=&a0;
  a2=&a1;
  a3=&a2;
  printf("%c\n",***a3);
  return 0;
}

> 359 4 > 4.c

のように、ファイルにリダイレクトしてコンパイル通るか確かめられたし。
>>342

>>346の発言について小一時間考えてみろ
こいつの真意は知らんが
おまいへの痛烈な批判になっているぞ
そーかな
364288:03/12/14 16:06
>341さんのソースを参考にしたらできました。感謝
キャストの仕方が間違っていたようです

お騒がせしました(´・ω・`)
365355:03/12/14 16:12
>>356-367
>>313
>qのアドレスと、pの値は同値のハズですが

の発言から、

 "「p==&q」が真になるはず"="pの「value %d」の表示とqの「adq %p」の表示が同値になる"

かと思うた。
>>362

>>342の発言がどの発言に対して書かれたものか小一時間考えてみろ。
367359:03/12/14 16:34
>>360
少なくても>>359で書いたものくらいなら
大丈夫らしいですね。
>>359
普通その数自体には特に制限は無く、
プログラムの解析処理の限界
(複雑すぎる、文字数が多すぎるなど)の方で引っかかる。
>>366
30分も考えてそんな答えか( ゚д゚)ペッ
最後まで何か言わないとメンツがたたないからって
そういう板違いはやめとけや
>>369は2chにはりつきっぱなしの御仁
個人攻撃しかすることなくなったわけね(プゲラ
>>362とか>>369
なんでそんなに煽ってるんですか?
>>371
図星だからってそんなに照れなくていいよw
374336:03/12/14 17:49
>>337
ただいま。若者集まる繁華街なんかで人ごみにもまれないで、
家族連れの集まる公園でのんびりした後買い物してきたよ。
int *a;
int b[][SIZE] = {{...}, ...} ;
...
a=b;
で型が合わないって警告されるんだけど、なんでだ。
bは配列の先頭要素へのポインタになるんじゃないのか?
a は int *
b は int (*)[SIZE]
型が違う。

どうしても入れたい場合は
a = b[0]; か a = (int*)b; とする。
正確に言うなら b は int (*)[SIZE] と互換性がある、というか、
それへ暗黙にキャストされうるというか、そんな感じ。
int * へはダイレクトに行けない。
>>373
図星とは本来の論点(ここではstdarg)に関して反論が尽きたお前のような者が
それを無慈悲に言い当てられることを言う

ところで休日に2ch見てたら何か悪いのかよ、え? 馬鹿じゃねえの
>>378
あはは。
#ifndef _VA_LIST_DEFINED
#ifdef _M_ALPHA
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
#else
typedef char * va_list;
#endif
#define _VA_LIST_DEFINED
#endif
381=366
>>381
グッジョブ
げぷー 飯食ってきたが
絵に描いたようにぐうの音も出てねえな
>>377
int (*)[SIZE];
ええっと…これ日本語にするとどういう型ですか。

それと暗黙のキャストって、
配列の名前(bとか)の元の型は、
その配列の要素へのポインタ型じゃないってこと?
>>385
>ええっと…これ日本語にするとどういう型ですか。
配列へのポインタです。
int a[10]; の a が &a[0] と互換性があるように、
int b[10][10]; の b は &b[0] と互換性があるのです。

>その配列の要素へのポインタ型じゃないってこと?
配列の名前がポインタ型を持つと仮定すると
sizeof b がポインタのサイズになってしまいますが、
配列のサイズになりますよね。
それ以外は大した違いはありませんが。

int *p = NULL;
int (*q)[10] = NULL;
printf("%p %p\n", p, p + 1);
printf("%p %p\n", q, q + 1);

とかやってみたり、

int b[5][10];
int *p = b[0];
int i, j, ij;

for(i = ij = 0; i < 5; ++i)
 for(j = 0; j < 10; ++j, ++ij)
  p[i * 10 + j] = ij;

for(i = 0; i < 5; ++i)
 for(j = 0; j < 10; ++j)
  printf("%d,%d %d\n", i, j, b[i][j]);

とかやってしばらく考えてたらよく分かると思う。
Cをどのくらいマスターすれば
C++を習ってもいいですか?
388346:03/12/14 21:22
>>362
おいおい、俺は>>342と同感だぞ。
晒しさげ( ゚д゚)ペッ>>362
ここは環境依存の問題はなしだから、
必ずしも va_list が char* で実装されるとは限らない...
とかそういうことを言いたいやつがいるんかな??
別にそこまで厳密に話さんでもと思うがなぁ。
>>390
それがこの話の核心部分だと思うがどうかw
>>288 の環境で考えてやっていいじゃん。
分かった上でやってんならさ。
>>387
ポインタ理解できたら
394313:03/12/14 23:28
>>355
そうです、その通りです。
教科書では、pの値にqのメモリアドレスが代入される、って書いてあったから、
pの値とqのアドレスが等しくなくてはならなかったんです。
要するに、コンピュータのメモリに変数pとqがどういう形で格納されているかを知りたかったんです。

今までで一番納得できる結果が得られました。ありがとうございます!

ついでにお聞きしてよろしいですか?
という事は、&は変数を格納したメモリアドレスを示すんだから、指定子は%dかな、って思ったんですが・・・・
やったら変な結果になってしまいました。
%pは「ポインタに」格納されたメモリアドレスを表示する、と書かれていました。
ここで全部解決するんですが・・・
変数を格納しているメモリアドレスを表示、と読み替えても正解でしょうか?

そしたら、adp %p , &p が完全に理解できるんですが・・・・
>>394
> 変数を格納しているメモリアドレスを表示
そう。表示形式は決まっていないけどね。
396313:03/12/14 23:40
これで問題ありませんか?

p = &q;
*p = 16;
printf("adp %p, value %d,,, adq %p, value %d,,,\n", &p, p, &q, q);
printf("*p == %d\n\n", *p);

*p++;
printf("adp %p, value %d,,, adq %p, value %d,,,\n", &p, p, &q, q);
printf("*p == %d\n\n", *p);

*p--; /* pが指すアドレスを元(qのトコ)に戻す */
(*p)++;
printf("adp %p, value %d,,, adq %p, value %d,,,\n", &p, p, &q, q);
printf("*p == %d\n\n", *p);

↓結果

adp 0012FED4, value 1244872,,, adq 0012FEC8, value 16,,,
*p == 16

adp 0012FED4, value 1244876,,, adq 0012FEC8, value 16,,,
*p == -858993460

adp 0012FED4, value 1244872,,, adq 0012FEC8, value 17,,,
*p == 17
397313:03/12/14 23:46
>>395
レスサンクス。
すると、変数を格納しているメモリアドレスを表示するためには
フォーマット指定子%pと、ポインタ演算子&の両方が必要、と。
コレが最後の結論になるんですが、合ってますか?

だとすれば・・・・Cってスマートじゃないなぁ・・・・
ダブってる。
pはポインタ型だから、value %p で表示すべきじゃないでしょうか。
>>397
ビミョーに考え方がズレとる気がする…
ポインタ=アドレスと参照先の型を併せた情報
ポインタ型=ポインタを表現する型
ポインタ変数=ポインタ型の変数

%p はポインタを渡すと、
その参照先の型の情報は表示せずアドレスのみを表示
(正確に言えば型の情報を表示できるように
 printf を作ることができないのだが)。

という風に思っておくと幸せ。

でも & はアドレス演算子でアドレスを取得するって言うんだよな。
ちゃんと型情報があり、まさに参照先を指し示せるのに、
何でポインタって言わないんだろ?
このあたりの用語が今ひとつ分かんないんだよな。
401313:03/12/14 23:55
それもそうですね・・・・
結果は10進か16進かの違いで、同じ数値でした。
pの値==pが指しているアドレスなので、同じだという事はわかりましたが、
やっぱ、pが指しているアドレス value %p の方がスマートですかね?
もしかして・・・・フォーマット文字列に%pと書くと対応する引数から自動的にアドレスを得ると思っていたのかな?
printf("%p",n);とすると&nと書いたのと同じになる(%dならnのまま)と思っていたのかな?
フォーマット文字列とはいえ単なる文字列で、それを解釈するのは関数内での仕事。だから呼び出し元が自動的にアドレスを得るということはない。
int q;

q は int 型変数。
int は符号付整数型。
q の保持する値は符号付整数。
&q はポインタ。既に変数じゃないのでポインタ変数ではない。
&q の型は int * で、ポインタ型。

int *p;

p はポインタ変数。
int * はポインタ型。
p の保持する値はポインタ。
&p もポインタ。既に変数じゃないのでポインタ変数ではない。
&p の型は int ** でやっぱりポインタ型。
404313:03/12/15 00:12
>>402
最初は完全にそう思い込んでました!
だからド派手に混乱したんです。

401は398に対するレスです。

>>400
参照先の型を合わせた情報、とは、参照先がintなのかfloatなのかcharなのか・・・・っていう事ですか?
つまり、ポインタとは、指定先のアドレスと型をまとめた情報、とこういう事ですね?
そんでもって、%pは 参照先の変数が、intかfloatかchar・・・・なのかっていう事までは受け取れない、という事ですね。

そのまま言ってるな、俺・・・・うおおおおお、あと少しで完全理解・・・

&はポインタ演算子、って書いてあります。独習Cです。
405313:03/12/15 00:12
>>403
丁寧な解説ありがとうございます。
406385:03/12/15 00:20
>>386
やってみますた。
最初のプログラムの1足してアドレスが40増えた部分で,なんとなく理解できたような…。
(ナントカ型をx個持つ配列)型、ってのがあるんですね。
で、a[10]とかやってaを評価すると、配列全体の値を表現すべきところを、
sizeofとか以外は勝手にアドレス値に変換しちゃうと。

char a[10];
sizeof(a) = 10
sizeof(a+0) = 4
(Д)゜゜
>>406
a + 0 になるとポインタ演算の結果ポインタになって、
サイズが 4 になってしまいます。
HSP>C?
int HSP = 0;
int C = 1;
HSP > C ?
puts("(´・∀・`)") : puts("( ´,_ゝ`)");
puts('HSP' > 'c' ? "アウストラロピテクス ": "猫");
>>409
a < b ? x = c : x = d;
x = a < b ? c : d;
> 'HSP'
君はアフォ過ぎる
'HS'までなら入るんだがな
414410:03/12/15 20:07
文字定数って4文字まで入るとオモテタ・・・
うはwwwwwwwおkkwwwwwwww
原始的で何の役にも立たない言語を一から学ぶメリットなんてないよ。
おすすめはVB、JAVA、HSP。
418デフォルトの名無しさん:03/12/15 21:54
C言語初心者スレはどこですか?
【初心者歓迎】C/C++室 Ver.3【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1069719929/
420デフォルトの名無しさん:03/12/15 21:58
>>418
なぜここで聞く
421デフォルトの名無しさん:03/12/15 22:01
>>420
Cで検索したらたくさんヒットしすぎるし、
C言語だとこのスレしか引っかからなかったんだよ馬鹿死ね
そのくらい分かるだろ普通の脳味噌なら
422デフォルトの名無しさん:03/12/15 22:04
>>421
どうしてこのスレが目的のスレだと思わないのか、理解に苦しむ。
どこにも上級者用とは書かれていないし。
>>422
理解しようとしていないだけなんじゃないのか?
421は普通に痛いが
422は桁外れに痛い
421からの流れでその発言は頭悪すぎ
>>424
お前のその発言はどうなんだよ。
>>424
オマエモナーと言っておく。
427デフォルトの名無しさん:03/12/15 23:05
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=30
ソースを書くとき↑これの上のパターンを使う人が多く感じますが個人的には下が見やすいです。
どっちでも良いといえばそれまでですが、この辺は趣味の問題ですか?
428デフォルトの名無しさん:03/12/15 23:08
>>427
趣味の問題
俺は上(尤もこの場合は{}はつけないけど)
>>427
個人的にはという時点で結論は1つ
>>428
確かにこの場合は私もカッコ付けませんね、レスどうもでした
>>429
レスどうもです、自分の趣味で行きます
掲示板とか本の解説とか行数を気にするときは上がおおいな
でもなぜか関数の頭の{の前では改行する。
K&Rがそういう書き方なんだっけ?(今手元にないので確かめられない)
Java ではクラスもメソッドも if などの制御構造も
{ の前は改行しない書き方があるよね
>>434
言語違い

おまえはアメリカの常識で国道16号を右側通行でもしてろ
>>435
視野が狭いのな
質問です。


DIO(デジタルI/Oボード)などに入出力を行う関数
inportbやoutportbは、標準ライブラリではないのですか?

また、これら関数の正確な定義はどうやれば判りますか?

宜しくお願いします。
>inportbやoutportbは、標準ライブラリではないのですか?
ではない。

>また、これら関数の正確な定義はどうやれば判りますか?
アセンブラの in, out を使ってるだけじゃないかな。
439437:03/12/16 00:55
>438
有難う!どおりで、検索しても出ないわけだ。
しかし、当たり前のようにプログラムに書かれているから
なかなか理解できなかったよ。

データ転送命令のようですね、アセンブラの。
I/Oポートからデータを読み込や書き込む命令のようです。

知っていたらで良いのですが、
vxWorksでのsysInbyteも同じように考えていいのでしょうか?
×どおり
○どうり(道理)
質問させてください。
iconv()でSJIS("PCK")からJIS("ISO-2022-JP")に変換する際に
ソースデータがバイナリで
8F 40 8F 41 8F 42 8F 43 8F 44 8F 45 20 8F 46
の15バイトだった場合、@iconv()は0x20を見つけた時どういった
処理をする仕様なのでしょうか?
Aまた、もし変換及び無変換もせずにそこで処理の中断をしてしまうなら
0x20などの処理はどのようにするのが妥当でしょうか?
Bsize_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
上記ソースを読む場合引数のsize_t *inbytesleftにはいっぺんに15バイト読ませて
しまってよいものなのでしょうか?

分かり辛い質問で恐縮ですが、以上3つの質問になります。
ご教授お願いいたします。
442437:03/12/16 01:05
>440
苦笑。

ttp://odalab.spub.chitose.ac.jp/~oda/vxWorks/pci.html
を参考に考えているんだけど、すれ違いかなあ。
ごめんね。
>>442
うん >>441
>>419(環境依存という意味だよ)
【機種依存文字OK】
445おやくそく:03/12/16 09:30
「機種依存文字」とはなんでしょうか?
446教えてください:03/12/16 12:41
教えてください。

現在Linuxで実行中のプロセスの情報を取得するプログラムを開発しています。
いろいろ調べたところ構造体task_structを使用するらしいのですが,
そこから先がどうすればuid,gid,プロセス実行開始時間
などの情報を取得できるのでしょうか?

よろしくお願い致します。

/proc を見れば。
>>446
すれ違い
>>446
psのソース読めば?
つーか、psこそお前の作ろうとしているものだろ。
psのソースみてps作るってか?(w
>>446
uid -> getuid()
gid -> getgid()
プロセス実行開始時間 -> 知らん

システム依存だからUNIXスレ言って聞いてみてな。
451CPU100%:03/12/16 15:39
Cでenvを一覧するプログラムってどうやってつくればいいの?

foreach ($_SERVER as $key => $val)
{
print "$key = $val<br>";
}

みたいに。
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]) {while(*envp) puts(*envp++);}
453CPU100%:03/12/16 15:49
できました、できました!
ありがとうございました!
454教えてください:03/12/16 16:03
>>447
/proc配下は/proc/<数字>/があり,この<数字>がpidであること
はわかるのですが,各pidのもつ情報をC言語で取得したいのです。

psのソースを読めとあったのですが,psのソースはどこで入手
すればよろしいのでしょうか?

よろしくお願い致します。
>>454
>>450 は見えてませんか?
456ヽ(´ー`)ノ:03/12/16 16:52
Linux 板の方がいいんとちゃうんかな…。
質問ですが8パズルの簡単なプログラム
を作ろうと思うのですがどなたか綺麗で簡潔な案ありませんか?
ただ質問しても煽られるだけだと思ったので
私が作ったのを貼ろうと思ったのですが本文が長すぎて
貼れませんでした・・・
プログラムに解かせるのか人間に提示して解かせるのかが抜けてる。
で、綺麗で簡潔な案って?
解くアルゴリズムが欲しいんなら、Cスレじゃなくて、アルゴリズムスレへ。
>>457
まずは、その「8パズルとは何か?」から説明するべき。
って言うか、スレ違っぽい気がする。
460名無し募集中。。。:03/12/16 18:16
同じワークスペース内で main.c sub.cがあるとして
main.c内で外部宣言してある変数aの内容をsub.cから
参照するにはどうしたらいいでしょうか?
461デフォルトの名無しさん:03/12/16 18:18
C言語のインタープリンタを作りたいのですが、普通はどうやって作るのですか?
if文でif(Str[i]=='w' && Str[i+1]=='h' && Str[i+2]=='i' && Str[i+3]=='l' ・・・
こんな感じに作ったのですが、これじゃダメですよね。
>>461
こっち見てからしとくれ
http://pc2.2ch.net/test/read.cgi/tech/1021136715/
>>460
sub.cに
extern int a;
などと記述すれば良い。
整合を取るために、main.hの中でextern宣言をして、main.c, sub.cの両方から
#includeで取り込む方法もある。
464460:03/12/16 18:46
>>463
ありがとうございます!やってみます
465デフォルトの名無しさん:03/12/16 19:13
数値計算した結果が、"1.#QNAN0"となってしまいました。
どんなエラーと考えられるのでしょうか?
これ動かしたらどうなる?
main(){
double a = 0.0;
double b = 1.0;
double c = b/a;
printf("%f\n", a/a);
printf("%f\n", c);
printf("%f\n", c-c);
printf("%f\n", c/c);
}
http://www.geocrawler.com/archives/3/6013/2002/9/750/9565780/

C:\c>temp
-1.#QNAN0

[Broken]

This makes MINGW unsuitable for code using long double. If the limits
were equal to those of double (except precision stuff), everything would
work almost as expected with undefined behaviour to overflow, and
truncation to decimal part depth on printing which would be better than
what we have now.
468デフォルトの名無しさん:03/12/16 20:23
タイムスタンプが1983年ごろのソースをボーッっと眺めている
んだけど、このころのCって関数の引数をレジスタ渡しできて、
あたかも参照渡しのようにふるまうんでしたっけ?

manko(a)
register int a;
{
a++;
}
main()
{
register int chinko = 0;
manko(chinko);
/* chinkoの値は1になっている。 */
}

数年前まで古臭いウニクスマシンが有って遊ぶことが出来たんですが
全部廃棄処分になってしまって今試せないっす。
そんな事どうでもいいよ
int *p;

if( p ){…}

という感じのコードをよく見るんですが、
NULLは必ず偽になるのが保障されてるんでしょうか?
NULL==0とは限らないという話を聞いてから、だいぶ不安です…
>>470
>NULLは必ず偽になるのが保障されてるんでしょうか?

保障されている。

>NULL==0とは限らないという話を聞いてから

誰に聞いたのか知らんが、完全なデマだ。もしくはお前が間違って覚えてる。
>>470
NULLは偽でNULLは0 ただし浮動小数点数の0.0も含め、ビットパターンが全て0とは限らないからmemsetを使ってはいけない。
http://www.catnet.ne.jp/kouno/c_faq/c5.html
>>471
デマでは無い。
((void*)0) である可能性がある。

まぁ、今回の話とはまた別な話だが。
>>473
それも0がvoid*型にキャストされただけで、やっぱり偽になるんですよね?
>>474
なる
0をポインタにキャストしたり、ポインタ変数に代入したり、型がポインタの引数に渡したりするとヌルポインタになる
そしてそれは必ず偽 それ以外のポインタは必ず真
えがった…
みなさんありがとう。
最近慌ててつけたみっともない==NULLを取っ払います。
ヽ(´ー`)ノ
いや、== NULL は可読性をあげるために付けた方がいいと思うぞ。
p はポインタだって言うのが一目で分かる。


って、またこういうこというと宗教戦争が始まるわけだが。
>>476
俺は書かないが、全然みっともないと思わないぞ。
sizeof(char)はみっともないかなぁと思うけど。
つーか標準で保障されてるのが信用できないのなら
if( p ) が信用できず
if( p == NULL ) が信用できるというのも
理解しがたいところだがな。
(C++ではむしろ前者の方が安全かつ確実だし)
みっともないのはNULL==p
>>478
sizeof(char)べつにいいんでは?
charじゃなくて別のにしたいときに変更しやすい
はーおまいらまたなるぽおっぱじめるの
過去にもなんかあったのか
>>483
C言語関連スレでは恒例行事です。
特に年度替りに多く見られしばしば季節を実感させると言われています。
なるぽ‐まつり【なるぽ祭】
(→)ぬるぽ-まつりに同じ。<<季冬>>

ぬるぽ-まつり【ぬるぽ祭】
C言語コミュニティの祭礼。昔は年中、今は12月17日から翌年正月3日まで行う。<<季冬>>
  ∧_∧
 ( ´∀`)< ぬるぽ
>>480
禿しく同意。
あと、タマに見る nantoka_flag == FALSE。
488デフォルトの名無しさん:03/12/17 14:51
みっともさの海をのたうち回れ
>>487
まぁ、TRUEと比較するよりはましってことで。
/* 文字列検索プログラム 検索文字列はコマンドラインから与える(rei22.c) */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char s[256];
int i, len;
if(argc != 2) /* コマンドライン引数の個数が2でないなら */
{
printf("usage: rei22 <検索文字列>\n"); /* usageが何を意味しているのか判らない */
exit(1); /* プログラムの終了 */
}

len = strlen(argv[1]); /* strlen()は文字列の長さの関数 */
while(gets(s) != 0) /* sに文字が入力される間は繰り返せ */
{
for(i = 0; i < strlen(s); i++) /* iがsの文字数未満の間はiに+1しながら繰り返せ */
if(strncmp(&s[i], argv[1], len) == 0)
break;
if(i < strlen(s))
puts(s);
}
}

まだ勉強を始めて4日目の新米ですが判らないので教えてください。19行目のif(strncmp(&s[i], argv[1], len) ==0)が理解不能なのですがどういう意味なのでしょうか。
検索でどうにか調べてみるとstrncmp(s1, s2, N)でs1とs2をN文字分比較するとなっています。
つまりここでは例えばコマンドライン引数に「abcd」と入れればs2がabcdでNが4になるのまでは判るのですが「&s[i]」が何を示しているのかがわかりません。&はアドレスの位置を示すとしか習っていないのですが何故ここでアドレスがでてくるのでしょうか。
後s[i]は一文字のchar型文字を表すと思うのですが一文字と四文字をどうやってstrncmpで比べてるのでしょうか。
19行目が理解できないのでその後の21行目if(i < strlen(s))も判りません。どなたか詳しく18-21行目を解説していただけないでしょうか。まだポイントも習っていなく多分多くの認識間違いがあると思いますがよろしくお願いします
491奈々氏491:03/12/17 16:23
すいませんが、C言語でより正確なcos(コサイン)を求めるにはどうすればいいでしょうか?

#include <stdio.h>
#include <math.h>
main()
{
double a;
double b;

scanf("%le", &a);

b=cos(a);
printf(" 残りの1辺=%le",b);

return 0;
}

で求めると、-9.524130e-01とかのわけの分からない物が出ます。
doubleをfloatに変えて書き直すと一応普通の数字が出ますが、正しい数値とだいぶ違うものが出ます。
普通の数字で出来るだけ正確なcos(コサイン)を求める方法を教えてください。
>>491
ラジアン
> -9.524130e-01とかのわけの分からない
指数形式
>>491
わけのわからんのはあなたですよ
どうせ、cos(60.0)でも計算したんだろ
cosって引数に上限ないんじゃないの?
497奈々氏496:03/12/17 17:13
お手数ですが指数形式のものを普通の小数形式に変換する方法は
無いでしょうか?
>>497
%le→%lf
>>496
どこに上限の話がある?
>>490
> if(strncmp(&s[i], argv[1], len) == 0)
s の i 番目の文字から比較してる。
i 番目の文字のアドレスが &s[i] になるってのは分かるかな?

> if(i < strlen(s))
i == strlen(s) なのは検索に引っかからないまま for が終了した時。

そのプログラム汚いのでリライトしといた。行を詰めてるのは単なる 2ch の改行数制限対策。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char s[256];
int i, len;
if(argc != 1 + 1) { /* コマンドライン引数の個数が 1 でないなら */
printf("usage: rei22 <検索文字列>n"); /* usage を英和辞典で調べれば意味が分かる */
return EXIT_FAILURE; /* 異常終了 */
}
len = strlen(argv[1]);
while(gets(s) != NULL) { /* 255 文字(改行除く)以上入力しない様に */
int s_len = strlen(s); /* 何度も strlen を呼ぶより変数に入れとく方が効率的 */
for(i = 0; i <= s_len - len; i++) /* s_len -len までで十分 */
if(strncmp(&s[i], argv[1], len) == 0) {
puts(s); /* ここで表示した方が汚くならないで済む */
break;
}
}
return EXIT_SUCCESS; /* 正常終了 */
}
501496:03/12/17 17:27
ごめん。度分法と勘違いしたんじゃないかって言う文脈だったね。
60.0が2π超えてるのがまずいと言ってるのかと表他。
>>498
%le → %f
503デフォルトの名無しさん:03/12/17 17:30
やっとprintfを覚えました!
画面に文字が出力されるなんて夢のような関数ですね。
>>503
次はsystem関数ですね!
>>490
&s[i]は s+iと同じこと。
506奈々氏497:03/12/17 17:43
というか、何でもいいですからcosを計算して普通に表示する方法は無いですか?
ある、答えも出てる
508デフォルトの名無しさん:03/12/17 17:46
>>506
%f
もしかして、最近の高校はラジアンも教えないのか?
510デフォルトの名無しさん:03/12/17 17:56
質問です。
キャストする場合は普通
i = (int)d ;
とか書くけど
i = int(d) ;
とか書けるコンパイラってあるの?
それとも、これってキャストではないの? 何してるの?
>>510
C++ では可能。
その場合、キャストしてるんじゃなくて、
int のコンストラクタを呼んでいる。
512デフォルトの名無しさん:03/12/17 18:00
>>510
なんのためにそんなことするの?
513奈々氏497:03/12/17 18:03
何度もすいません。馬鹿なもので。
#include <stdio.h>
#include <math.h>
main()
{
float a;
float b;
scanf("%f", &a);
b=cos(a);
printf(" 残りの1辺=%f",b);
rewind(stdin);
getchar();
return 0;
}
で計算したcos60がー0.952413と出るのですが、
普通0.5ではないのですか?
いったいどうしたら-0.952413が0.5になるのですか?
もしかすると根本から勘違いしているかもしれません。
そのときは言ってください。
cosの引数はラジアンで指定する
cos(3.14/180*60)
516奈々氏497:03/12/17 18:10
>514 cosの引数はラジアンで指定する
そうでしたか全然知りませんでした。
2chの皆様には大変迷惑をかけました。
付き合っていただいてありがとうございます。
>>515
そりゃ精度が低すぎるぜ...。
double なら 3.141592653589793 までは必要だ。
円周率は3
cos(acos(-1)/180*60)
520510:03/12/17 18:27
>>511
サンクス

>>512
他人がやってた、書いた本人はどこの誰だか知らない。
521デフォルトの名無しさん:03/12/17 18:32
Cやりはじめた初心者なんですけど、関数の最後にあるreturnってなんですか?
持ってる本には関数に値を返すって書いてあるんですけど、どういう意味かわか
らないです。
int func(){
return 10;
}
これならfunc関数の値は10になるってわけ?
意味わからんです、教えてください。
>>521
printf("%d", 10);

printf("%d", func());
の結果は同じになるということだ。
523521:03/12/17 18:37
int func(){
printf("%d",10);
return 0;
}

これだとprintf("%d", func());
でどういう結果になるのですか?
524デフォルトの名無しさん:03/12/17 18:39
>>523
やってみたら?(w
>>523
10
0
ってなる
100だろ。
>>526
そうだよ!おめーの言うとおりだよ!
100って書いたらわかりづれーだろ!
処理の順序をわかりやすくかいたんだよ!
まちがってるよ!
ああ、おれはまちがってるよ!
でも>>525をみてくれよ!
そこには>>521に対する優しさがあるだろ!
感じ取れよ!
感じ取ってくれよ!
でも俺の感じ取っている感情は精神疾患の一種だから……
>>527
単に見苦しい。
530デフォルトの名無しさん:03/12/17 18:57
#include<stdio.h>
#define A 100
main(){
double a[A][A][A];
return 0;
}

で実行するとエラーでるんですが、何ででしょうか?
確保できる配列の量って決まってたりするんですか?

WindowsXP,VC++6.0,でメモリは256Mです
>527
藻前の愛を感じたよ
>>530
愛が足りない
533無職PG:03/12/17 19:00
燃料となり得る才能を感じるが
そういう逸材はネタ系板に必要とされる人材である。
534無職PG:03/12/17 19:05
例えば
double a[4000000]はスタックに確保されるが
double* a=new double[4000000]はヒープに確保される。
コンパイラオプションでスタック容量を増やしてみたら?
535無職PG:03/12/17 19:19
ってゆうかスタックは65536以上は確保できなかったような記憶があるが
10年前のTC++の話なんで確かではない。
UNIX系のCならこういうことでエラーは出ないはず。
スタックに確保できなければエラー吐いて終了するしかないと思うが
UNIX系のCとやらは一体どんな魔法を
バイキルト
いくらなんでも>>535の発言は馬鹿丸出しだぞ。
539無職PG:03/12/17 19:31
>>538どこがどう馬鹿なのか言ってくれよ。それじゃただの罵倒だよ。
>ってゆうかスタックは65536以上は確保できなかったような記憶があるが

そういう環境があったとしても、それは一般論でも使用でもない。
単なる思い出話だ。

>UNIX系のCならこういうことでエラーは出ないはず。

UNIX系のCってのも漠然としてるが、とりあえず、エラーが出なくてどうなるのか?
まさかスタックが無限にとれるとでも?
いまさら、このCスレで、環境依存の、
IA16のセグメント制限を持ち出すあたり。
>>535
Linux2.4.22

int main()
{
char a[255*1024*1024];
a[4]=4;
return 0;
}

Segmentation fault (core dumped)
543デフォルトの名無しさん:03/12/17 19:38
指定したディレクトリが存在するか否かはどうやって調べればいいのでしょうか?当方linux環境を使用していまつ。。
>>543
stat
545無職PG:03/12/17 19:46
>>540-541 確かにいまさら時代遅れのセグメント制限を持ち出すのはばかっぽかった。
UNIX系Cってのはccやgccやc++やg++などのコンパイラのこと。
スタックオーバーフローは出ずにバスエラーやセグメンテイションフォルトが出たような。
546521:03/12/17 19:57
>>525ありがと、でもなんでreturnが必要なんだろう?
void型だとreturnはいらないみたいだけど、return使ってなにか得する
ことあるんですか?return 10ならprintf("%d",10);と書けばいいわけだし・・・
returnを活用したサンプルコード教えてもらえませんか?
521のような奴には、中途半端に教えずに
初心者向けの本を薦めたほうが結局本人のためになると思う。
というわけで、本屋へGO! >>546
548521:03/12/17 20:07
初心者用の本もってるんだよヽ(`Д´)ノ
でもreturn 0;とかばっかサンプルに使われてんだもん。。。
549無職PG:03/12/17 20:07
ネタだろうけど答えてみる
int function(int n)
{
for(int i=0;i<100;i++)
if(i*i>=n)return n;
 return -1;
}

10000以下のnの平方根の整数部を返す関数。
範囲外のときは-1を返す。
returnは大域脱出にも使える。
>>547
>>521は本を持っていると言っている。
個人的には教えてくれと言っている奴には教えたいな。
例えそいつの為にならなかったとしても。
551無職PG:03/12/17 20:10
間違えたw

int function(int n)
{
 for(int i=0;i<100;i++)
  if(i*i>n)return i-1;
 return -1;
}
void での例にしてやれよ。
まぁ、結局は途中で抜けたいときに使うってのは同じだが。
553無職PG:03/12/17 20:28
>>552
void function(int n)
{
 for(int i=0;i<=100;i++){
  if((i+1)*(i+1)>n){
   printf("%dの平方根の整数部は%dです",n,i);
   return;
  }
 }
 printf("平方根はみつかりませんでした");
}
平方根を発見したらreturnすることでループを途中で抜けられる。
>546
たしかに、10なら直接書けば好いかもしれないが、
これが、延々計算した結果の数値だったら、直接
書くわけにはいかないと気づくだろう。
>>535
リンカ解ってないやつ痛杉

>>553
巨大関数ジェネレータ
>>553
無能は黙っててくれ。
557無職PG:03/12/17 20:41
>>555
コンパイラオプションじゃなくてリンカオプションだったね。。。バカ丸出しスマソ。
俺が巨大なのか関数が巨大なのか?顔がでかすぎるって?
(* ´  Д   ` *)糞〜
>>553
> for(int i=0;i<=100;i++){
>  if((i+1)*(i+1)>n){

突っ込みどころ満載すで痛すぎ。
559デフォルトの名無しさん:03/12/17 20:58
遠慮無く突っ込んでおくれ
いちいちコンパイルしないでいいようなシミュレータみたいなのないでしょうか?
探しまくったけど見つからない・・・
561無職PG:03/12/17 21:07
for(int i=1;i<=101;i++)
 if(i*i>n)printf("%d",i-1);
って書いた方が実行効率がいいよ確かに。だけど重箱の隅だろ。
痛いとかバカだとか無能だとかとにかく言いたいだけなんだろ?
まぁ当たってるから反論しないけどムカツク。

562無職PG:03/12/17 21:09
>>560 インタプリタのこと?
563無職PG:03/12/17 21:14
コード1行1行追ってみたいならデバガ・・・
>>561
よく見ろよ、558は1箇所も突っ込んでねーだろ
おまいブラフに弱すぎるから(ry
565560:03/12/17 21:16
多分インタプリタのことです
探してみたけどシェアウェアしかみつからない・・・

簡単なプログラム作って勉強したいだけなんですけど
>>561
効率がいいというか、間違ってるぞ
567490:03/12/17 21:20
>>500他の皆さんお答えありがとうございます。
レスで自分が理解したと思われる事を書きます。もし間違っていたら訂正してください。

strncmp(&s[i], argv[1], len)のところの
&s[i]は「i番目の文字から入力された最後まで」の意味で良いのでしょうか。
例えば&s[i]がs[i]だと一文字だけを表すが&を付ける事でアドレスとなり「i以下の文字列」となる。
ここまでは理解したつもりです。ありがとうございます。


ただそうなると判らない事があるので質問させてください。
このプログラム(>>490)を実行すると検索文字がある「行」だけが出力されるのですが
(行のどこにargv[1]があっても一行まるごと出力される)
ソースを読むと(&s[i]がi以下の文字列だと理解して)検索文字が見つかった時に出力されるのは
「入力された全文」だと思ってしまうのですが何故一行しか出力されないのでしょうか。
多分puts(s)の認識が間違っているのかとも思いますがどう間違っているのか判りません
(自分ではputs(s)はsを全部出力する、だと思っています)
判り難い説明になって申し訳ないですがどなたかお願いします
568無職PG:03/12/17 21:25
>>566 >=だった・・・くそ無職PGから無能PGに改名か・・・
569無職PG:03/12/17 21:26
やっぱガソリンスタンドでバイトすることにするよ。ではさらば!
>>568
まちがってるのは、そこじゃねぇよ

>>567
gets(s)で1行ずつ(あるいは1行が255文字以上なら255文字ずつ)
sに読み込んでるからだよ。
&s[i]については、それ程違わないと思う。
ポインタを学んで、その後に「C言語FAQ」ってサイトを読めば
理解の助けになるかも。>>2くらいにURLは示されていると思う。
571無職PG:03/12/17 21:33
これでもいままで書いたコードは10000000行。1行平均40文字
で実際に現在運用されてるセキュリティー関係のソフトもあるぞ。はははは(・∀・)ノシ
C machineってもう手に入らない?
573570:03/12/17 21:36
>>571
今時LOCを言われても・・・。
先のプログラムを見ても、そりゃリストラされるよ。
ガソリンスタンドのアルバイト頑張ってね。
むしろ、本業にしちゃえば?
>>565
Python Tcl/Tk とか
575490:03/12/17 21:51
>>571
つまりgets(s)という関数は必ず一行「ずつ」格納しろっていう命令なんですね。
その行の中の頭の文字から(s[0])から順番に比較していけっていう命令なのか。ありがとうございます。
最後のputs(s)も一行取り込む毎に出力するか否かを判断するから全文が出るわけではないのかなるほど。

後、最後のif文の理解が出来ないので間違い正してくれると助かります。理解行程をコメントで書いていますお願いします

while(gets(s) != 0)  /* sに入力がある限り繰り返せ */
{
for(i = 0; i < strlen(s); i++) /* i=0から初めてsの文字数未満ギリギリになるまで以下の事を繰り返してiを1づつ増やせ */
if(strncmp(&s[i], argv[1], len) == 0) /* iから最後まで(行の終わり?入力された文字全ての終わり?)の文字を */
break;                   /* argv[1]と比較して同じなら(==0なら)breakしろ(iを増やしていく繰り返しを止めろ) */


if(i < strlen(s))   /* ここが判らないのですが上のfor()でbreakしてもしなかったとしても */
puts(s);        /* i < strlen(s)(上のfo()でそう指定してるし)になるので必ず真になると思うのですが違うのでしょうか */
}
>>572
東京コンピュータサービスが新人研修でくれますたw
577575:03/12/17 21:53
すみませんアンカーミスです。
お答えありがとうございました>>570
>>571
ちょっと待て。
それだと勤続年数40年毎日働いたとしても、1日平均700行って

多少コードがヘボくても補って余りあるパワーじゃねいか。
なんで無職なんだ
man頁のセクション3あるいは2に、Cの関数の説明が載ってる。
/* strncmp(3)
*
*    #include <string.h>
*    int strncmp(const char *s1, const char *s2, size_t n);
*
*    strncmp()  関 数 は、s1 と s2 の最初の n 文字だけを比較することを除け
*    ば、strcmp()と同様である。
*
*    strcmp() 関数と strncmp() 関数は整数を返す。この整数は、ゼロより も、1)
*    小 さい、2)等しい、3)大きいのいずれかである。それぞれは、s1(または、こ
*    の文字列の最初の n バイト)が s2 よりも、1)小さい、2)等しい、3)大きいに
*    対応している。
* ---
* gets(3)
*
*    #include <stdio.h>
*    char *fgets(char *s, int size, FILE *stream);
*    char *gets(char *s);
*
*    gets() は stdin から改行文字あるいは EOF (これらは '\0' に置き換えられ
*    る)までの1行を s で示されるバッファに読み込む。バッファのオーバーランは
*    チェックされない(下の バグを見よ)。
* バグ
*    gets() は絶対に使用してはならない。データを知ることなしに gets() が何文
*    字読むかを先に知る事はできず、 gets() がバッファの終りを越えて書き込 み
*    続 けるため、使用は大変危険である。
*/
コピペばかりしてたんでしょう。
581無職PG:03/12/17 22:09
>>578 上司に言われないことまでやったからだ。
例えばCPUをアセンブラレベルで動かすファームのデモをビジュアルで作ったり
そして上司対する説明責任を怠ったから辞めさせられたんだよ。
1日平均1500行だよ。
>>575
for( ...; xxxxxx ; ...)

xxxxxx には、for を継続するための条件が書いてある。
この条件が満たされている間ずっと for を行うって事。
つまり、break; せずに for が終了したってのは、
この条件が「満たされなくなった」ということになる。

ここまで言えば分かるかな?
>>582
そうか!つまり
i == strlen(s)なのか

本当にありがとうございました。謎は全て解けました。
むっちゃスッキリした助かりました
>>583
ご名答。
585無職PG:03/12/17 22:16
説明しきれないほど書いたから説明できないって態度でいたんだ。
まるっきりソフトを書いたことがないハード屋さんの上司に
毎日怒鳴られてたから嫌気がさしてやめたんだけどね。
>>無能な無職PG
ここ、C 言語スレなんで。
587583:03/12/17 22:20
>>584
久しぶりに興奮した。嬉しい。
最後に一つだけ確認させてください。
i=0から始まってるのにi==strlen(s)になるのは
strlen()が\nを一文字と数えないのに対してs[i]の方は\nも一文字として扱うから・・でよいですか?
>>587
数えなかったっけか?
589583:03/12/17 22:25
あ、関係ないのかな・・。
forでi++って決められてるって事は必ずi==strlen(s)までいくってことか。

>>588
数えないのはnullだけみたいですね。失礼しました。
また判らない事があったらよろしくお願いします
>for(i = 0; i < strlen(s); i++)
これはs²で遅くなるから止めた方がいい。
つーかなにをしたいコードなんでしょう?
>>490
文字列検索ではないのか?
>>590
まだ勉強始めて5日目なんで効率とかは判りません。
ただ、例としてあったコードが理解出来なかったので(解説もほとんどなかったので)
理解せずに進むのが嫌だったので質問させてもらいました。
効率が悪いという事は覚えておきますありがとうございます。

>>591
入力されたものの中に特定の文字列があるか検索し、hitすればhitした行を
出力するプログラムのソースコードだと認識しています
>>593
strstr()
>>593
気になるんだけど、その例は何かの本にでも載ってた奴なの?

>>594
strstr を作る例ってことで。
>>595
開始位置ずらしつつstrncmp。
>>595
ネットで載っていたC言語のサイトに載っていました。
getsは使わない方が良いとも別のサイトには載っていたのですが
取り敢えずそのまま理解してみようかと思いました。本は持ってません
>>597
そのコード非常に汚いので、
何か別のところで勉強した方がいいような気がする。

>>596
だからそれをやってるんじゃないの。
>>598
そうなんですか・・。
でも汚いと言ってもまだどこがどう汚いか理解出来ないレベルで
取り敢えず説明が自分に理解出来るサイトに行ってみたらここだったんです。

他のサイトもいくつか検索して行ってみたのですが初歩の初歩から解説してくれる場所が他になかった
(第一回とか見てもチンプンカンプンだったとこが多いです。コソアドの指定がどこを指しているのかがわかりにくいのが多くて・・)
ので使ってるのですが・・・・。ちょこちょこ暇見つけて他のとこも探してみるようにしてみます。
ありがとうございました
初心者に理解しやすくする為に
コードのスマートさを犠牲にすることは良くあることだ。
runCを使え
>>600
分かりづらかったらもはやスマートと呼べないだろが、このどあほ
「初心者に」理解しやすく
>>602
おまえ、あたま悪いだろ。
605デフォルトの名無しさん:03/12/18 03:12
糞えらそうに罵倒するようなことじゃなかろうに・・
つうか意味取り違えてるし。 頭大丈夫か?
>>603
>「初心者に」理解しやすく

もしかして糖衣表現とかが「スマート」とか言ってるのか・・・?
>>606
糖衣表現って何?
構文糖のことか?

ちなみに
スマート…賢い,理路整然,洗練
クレバー…ずる賢い,巧妙
スマートだけど初心者には理解しずらい、ってのは、例えば

  strncpy(pfrom, pto, slen)[slen] = '\0';

こういうこと?
610609:03/12/18 10:16
>>609
pfrom と pto、逆やん…_ト ̄|○
611デフォルトの名無しさん:03/12/18 11:25
#include <stdio.h>
int main(void)
{printf("2ch\n");return 0;}

ヘッダーファイルは、関数の定義と宣言をソース上に
取り込むという考え方で良いのですか?教えてください。
>>609
スマートに見えないのはオレだけか?
俺にもあんましスマートには見えないナ
宣言はヘッダに含まれているが、定義はそうとは限らんというか大抵は該当のlibをリンクする
>>611
■ヘッダファイル [header file]
 マクロ定数の定義や外部変数、構造体の型、関数のプロトタイプなどを1つのファイルとしてまとめておき、複数のプログラムファイルで共通して利用できるようにしたもの。
616611:03/12/18 11:50
お答えありがとうございます。

初心者のための(自分も万年初心者・・)C言語勉強のホームページを
作ろうと思っていて、どう説明すればよいか分からなくて質問しました。
今の所は「インクルードする事で宣言、定義をソース上に持ってきます」
見たいに書いています。序盤なんで当然複数のファイルにまたがらないし。
617デフォルトの名無しさん:03/12/18 11:59
>>616
定義はやめておけ
618611:03/12/18 12:00
コード量が増えてきた場合ファイルを増やしつつ.cと.hに分けると
やっていきますが、序盤なのでそれを書くとややこしくなって要点が
ぼやけてしまいます。scanfを序盤で使ってよく危険とか言いますが、
これの場合はそういう事は無いのでしょうか。
また良い書き方があるなら教えてください。
>>618
序盤では説明しなくて良い。
620611:03/12/18 12:07
>>619
決まりなので書いてください見たいなので良いですか?
>>620
#includeの説明だったらそれでいい
622611:03/12/18 12:12
>>621
分かりました。ありがとうございました。
#includeの説明なら「指定したファイルを取り込む」でいいんじゃない?
624611:03/12/18 12:36
>>623
分かりました。どんな感じで作用するかとかでなくて、単純に取り込む事で
使用できますみたいにですね。ありがとうございました。
>>624
「指定したファイルを取り込む」作用をするのが#includeってこと。


藻前は、プリプロセッサをちゃんと理解しているのか?
>>616
使えない“初心者”の拡大再生産はやめれ。
>>625
たぶん理解していると思います・・。

>>626
そんな言い方しないでください・・。
プリプロセス(#include, #define などが処理される)
 ↓
コンパイル(プリプロセス後のコードをオブジェクトファイルに変換する)
 ↓
リンク(オブジェクトファイルやライブラリから実行ファイルを作成する)

の流れくらい理解してないとな。
629デフォルトの名無しさん:03/12/18 14:29
これからC言語を始めようと思うのですが、PCはどのくらいのスペックが必要ですか?
WindowsXPでMicrosot C/C++を使うつもりでいるのですが、意見を聞かせてください。
>>629
Pentium Pro 以上。
>>629
気にしなくていいんじゃない?
632デフォルトの名無しさん:03/12/18 14:36
そんなにマシンパワーを必要としないという事でいいんですか?
Cの次はC++とかにも挑戦したいんですけど、その場合も同じスペックでOKですか?
>これからC言語を始めようと思うのですが

この言い方がそもそもおかしいわけだが、まあそれはおいといて、
マシンパワーは全く必要ない。
CだろうとC++だろうと、全く関係ない。
いやむしろ低スペックマシンを使え。
>>627
いや、まじでヤメレ。
初心者が初心者を教えられるわけねぇだろ。
嘘やデタラメを教えて混乱させて、自分と同じ低脳にさせて楽しむつもりか?
635デフォルトの名無しさん:03/12/18 14:44
>>633
じゃあクロック数は気にしない事にします。
もう一つ質問させてください。
Intel社のCPUを使った方が良いんですか?
今持ってるのがDuron搭載のPCなんで、不都合が出ないか心配です。
教科書に載ってるサンプルコードを
viクローンなエディタで編集して
それをコンパイルして確認するのに
必要なスペックは、たぶん
486DX60MHz、メモリ16MB以上。

Linuxとか FreeBSDだと
カーネルは、大半がCで記述されていて
make一発でコンパイルできる
ソースコードが公開されているので

要らない機能を削ったり、
必要な機能を組み込んだりして
条件コンパイルすると
用途にあったカーネルにすることができる。

コンパイラには
GNUのgcc
Intelのicc
tendraのtcc
などがある。

Windowsはむつかしいのでよくわかりません。

と、ものの見事に吊られてみるてすと。
>>635
だから、そんなことはCやC++とは何の関係もないじゃないか。
はじめる前からこんなこと言って申し訳ないが、
お前さん、プログラミング、向いてないと思うぞ。
その他のOSだと
QNXというのが、
いわゆるふつうのパソコンで動いて、しかも
開発環境が充実しているようだ。

QNXのウェブサイトには
とてもわかりやすいCの関数レファレンスが置いてある。

定番の
x86版 Solaris 9 は
Sunのサイトで20ドルで売ってる。

Sunはなんだかんだいって
昔から貧乏人に優しく、
学習用の開発環境は、必死で調べると
コストなしで入手できる抜け道が
用意されている場合が多い。

問題は、開発環境を揃えた後の
学習意欲では。
人のこと言えないけど。

それではごきげんよう。さようなら。>>>>逃
639デフォルトの名無しさん:03/12/18 15:14
>>637
何を怒ってるんですか?
もういいや、聞きたい事聞けたし、ヒステリックなヲタクには付き合ってられんわい。
640デフォルトの名無しさん:03/12/18 15:36
a.txtを開きます。
内容は

aaaaa (1行目
bbbbb (2行目

です。
#include<stdio.h>

main()
{
FILE * fp ;
char * p ;
char str [ 500 ] ;
char fname [ 100 ] ;

puts ( "ファイル名を入力してください。" ) ;
gets ( fname ) ;

fp = fopen ( fname , "r" ) ;
p = fgets ( str , 500 , fp ) ;    /* fp先ファイルから1行目を読み込んでstrに格納 */
while ( p != NULL)        
{
printf( "%s" , str ) ;
p = fgets ( str , 500 , fp ) ;   /* なぜここで1行目でなく2行目を読みに行くのですか? */
}
fclose ( fp ) ;
}
}
>>640
FILE構造体(fpの指している先)が覚えているから。
>>640
そういう仕様だから。
>>640
ポストが赤いから
>>634
まぁ、実際には公開しない方が世のため人のためだとは思うけど、
そういう講座を作ろうとしてみる事自体は勉強になるんでいいと思う。
自分がどれだけ理解してるか、してないのかってのがよく分かるからね。
理解してないなと思ったところは、
色々テストコード書いて徹底的に理解する。
そうすればいい勉強になると思う。

でもまぁ、1つの勉強法であって、
実際にそれ使って教えるのはまだやめた方が身のためだな。
教えるという行為は実は人の為でなく自分の為に一番なると思う
死ねよクズ↑
C machine ってもう手に入らないの?
645の命題が真だから
学校とかで勉強出来るやつと出来ないやつの差が開く一方になるんだな
>>647
C machineとは?
650デフォルトの名無しさん:03/12/18 16:57
>>639
2度と来ないでください。
Cのクソ本があふれてる時代だからな
クソ本で覚えた野郎はクソなコードを量産する
害としか言いようが無い
>>649
C インタプリタだったかと。
ただ、仕様準拠じゃないので
いろいろ問題があるとか聞いた事がある
(使った事無いけど)。
だから、この C 言語なら俺に聞け! スレでも
>>1 に C machine は不可とか書いてあることがある。
このスレでは書いてないみたいだけどね。
>>651
そもそも本だけ読んでコード書く奴は糞なコード書く。
色んなソースを読み漁って、目を養って欲しいよ。
小説をまったく読まない奴が、いきなり小説書けるわけないんだからさ。
読むだけでもなぁ。
まぁ、読むのも非常に大事だけど、
書かないとね。
ミステリーをほとんど読まない人が物凄く面白いミステリー書く事はあるな
>>655
それは日本語を自在に扱えるという事ができる人だからな
>>656
あなたは日本語が上手では無いようですね。
音楽あまり聞かないけど凄いいい音楽作る人もいるね...。
まぁ、こういうのはオリジナリティが重要だからそういうこともあるけど、
プログラムは基本的にはオリジナリティいらんからな。
>>658
ほんとですか?やる気が湧いてきました
いらんだろ。
要るとすれば、目的のプログラムを作るために問題を分解して考える能力と
それを如何に効率よく処理するかを考える能力。
個人でやる分にはね。
会社でチーム組んでやるんなら、それプラス、可読性やドキュメントが重要
メンテがやりにくいったらありゃしない
音楽理論しらなくても良い音楽作る人は沢山いるが
音楽聴かないのに好きじゃないのに良い音楽作る人っているか?
C言語なら俺に聞け!
次の質問どうぞ↓
音楽なら普通に生活してたら、それなりに聞こえてくる。
それこそ、TVなんてつけたら音楽なんていっぱい流れる。
街に出ても音楽なんていっぱい流れてる。

ヒッキーでTVもラジオもつけない様な生活なら話は別だが…
↑空気読めない香具師
>>662
管野よう子とか。

痛い香具師
無駄話は他所でやれ、クズが
以下のようなプログラムは簡略化できますか。

if ( i == 32 ) a = 1 ;
if ( i == 16 ) a = 4 ;
if ( i == 22 ) a = 3 ;
 <以下同様に20行くらいつづきます。>

a と i には計算式で求められるような関係はありません。
switch 使えよ。
>>669
switchを使え
672669:03/12/18 19:52
>671
>670

なるほど! なんか計算速度も上がった気がする。 (気のせいか?) ありがとざいました。
iの範囲があまり大きくなくて、何度も実行されて速度命なら、配列使え
674669:03/12/18 19:58
>673
i の範囲は 64までで a は 4000までのむちゃくちゃな数。
でも、配列というモノをあまりよく理解できていません。すみません。
>>674
使ってる教科書を読み直して、色々な処理方法の中から
どの手を使えば効率が良いか考えてプログラムを組む練習を
した方が、伸びるよ。
とりあえず教科書を読みきれ。
static int A[65] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};
a = A[i];
while文を抜ける条件とそのときの処理が複数あるとき、どう書くのがいいですか?
1は二度手間だし、2はwhile(1)とbreakがなんかヤダ…
これで一日中悩んでちっとも進んでません。

1)while ( flag1 && flag2 ){ }...;
 if (!flag1) ... ;
 if (!flag2) ... ;
2)while (1){
 if (!flag1){ ...;break;}
 if (!flag2){ ...;break;}
 ...
}
678669:03/12/18 20:14
>676
すごい、これは便利!ですね。ありがとうございます。いやー、いろいろな方法があるモノなんですね。
>675
おっしゃる通りだと思います。反省。今後も気長によろしくお願いします。
>>677
1)が普通かな。素直に読めるし。
あとは、番人で条件を削減できないか考えてみる。
>>677
2)が普通じゃないの?
while節で処理を済ませる方がキレイな気がするし、
ここでのwhile(1)とかbreakは醜い物ではない。
まあ、どうでもいいような違いだがな。
while節でなくてwhile文やろ
>>679
番兵のこと?
>>677の1と2って内容が違ってない?
2が期待している処理だとしたら1は、
if (!flag1)...;
else if (!flag2)...;
になると思うのだけど。
684677:03/12/18 21:08
そうでした。これだと両方実行されちゃうな…
>>680
>ここでのwhile(1)とかbreakは醜い物ではない。
いや、それどころか常套手段。
正直、>>677 が何を嫌がっているのか理解不能。
>>685
条件が単独か複数かで
シンタックスが大きく変わっちゃうのに納得できないんでないのかね?
過度に言語を信頼してもっと上手く書く方法があるはずと
思ってしまうのはプログラムが面白くなりかけたことによくあることだし。

あるいは明示的に無限ループを書いて
それを抜ける命令を書くのが危険を生みそうで嫌だとか。

経験積む内にどちらの危惧もなくなるけど。
687ごめんなさい:03/12/19 00:19
select()を使ってHTTPの中継プログラムを作っています。

User-Agent:行に応じてサーバへの要求文を書き換えようと思っているのですが、
要求文の後にUser-Agent:行があるので、要求文を一時的に保存しておかなければいけません。
要求文が何文字になるか分からないので、どう格納すればいいか困っています。
解決策をよろしくお願いします。
mallocした領域にfgetsして、足りなければreallocして増やすとか?
689687:03/12/19 01:24
何文字受信しなければいいのか分からないので、
1000文字ずつ受信して、その都度FILEに書き出していたのですが、
mallocを使う場合はどのようにすればよろしいでしょうか
690687:03/12/19 01:26
ごめんなさい。

はじめに中継するだけのプログラムを作ったので、
1000文字受信して、その都度サーバに1000文字ずつ送信していました
691611:03/12/19 01:33
お答えありがとうございました。
作るのに否定的な意見がたくさん出ましたが作ります。
ただ「自分も初心者で講座と言いつつ実は自分が勉強するために
作りました。間違っている所があったら教えてください。」
見たいな趣旨のサイトにしたいと思います。
文字数が相当多い場合はreallocしまくるときつい気がする。
再割り当てのコストもでかいし
ある大きさの配列を1ブロックとして
さらにそのブロックを配列/リスト化する
というような二重構造の方が向いているような。
(C++にあるdequeのような構造)

書き込むときはメモリが足りなくなったらブロックを追加し、
読み出すときはあるブロックの終端まで来たら次のブロックへ移る。
C言語で1〜1000まで動くint型の整数を、char型で定義された4つの文字に
各桁ごと分け入れるというプログラムを考えてますが…うまくいきません。
キャスト(?)を行って、強制的にchar型の文字に代入していますが正しい値が表示されないです。
こちら全くの初心者なので、お分かりになる方ご教授下さい。
>>692
reallocしまくるっていっても、1回の増分を1024とかにしとけば、
そうそうreallocする機会もないでしょ。念のためってやつ。
もちろん一度大きくしたバッファは次の行でも再利用するっていう前提ね。
毎行reallocしてればCPUも疲れるっしょ。

>>687
fgets/malloc/reallocを使って任意長の行を読み込む関数fgetlineを作れ
っていう練習問題だと思ってやってみれば、ちょっとは勉強になるよ。

インタフェースは
char *fgetline(FILE *stream);
ただし次にfgetlineを呼ぶと、以前に読み込んだバッファの内容は消える。
ってかんじ。
行の長さを引数で返してもいい。エラー処理やEOFも考慮にいれるべき。
(そうなると、だんだんBSDのfgetlnみたいになるけど)
>>693
文字コードって知ってる?
>693
char itoc(int i) {
return '0' + i;
}
みたいにすれ(関数化しろって意味じゃないぞ言っとくが)。
というか複数のcharじゃなくてchar[4]に代入するとかなら
(実際何でそうしないのか理解に苦しむ)
>>696を拡張した
itoa関数を自作するか
sprintfを使えばいい。
sprintfは汎用的すぎて遅いという話もあるが気にするな。
ああ、sprintfは最後に'\0'が入るから
書き込み先に桁数+1の余分な容量が必要になるから
もし使うんなら間違えないように。
699687:03/12/19 02:40
>>692 >>694
ありがとうございます。
光が差し込めてきました。
がんばります
700693:03/12/19 02:44
>>695
なんとなく聞いたことがあります。
>>696-698
いろいろな指摘どうもです。こちら初心者のため発想も乏しく、また初めて見る関数もありますので、ぐぐりつつもう少しだけ頑張ってみます。
>>700
int a = 395;
char str[16];
sprintf(str, "%04d", a);

こういうんはあかんの?
>>687
まず、スレ違い。
そして、規格くらい嫁。

http://www.studyinghttp.net/rfc_ja/2616/rfc2616_ja.html
>>702
別にスレ違いではないと思うけど。
「HTTPの中継プログラムのつくりかたを教えて」ならスレ違いだけど。
>>687
C++を使わないのはなぜだろう?
705デフォルトの名無しさん:03/12/19 17:03
Unko
>>704
弟の遺言
C++まで勉強してるとは限らないからね
708687:03/12/19 22:39
おかげさまですっきりしました。

>>704
C++を使うと例えばどのような解決策があるのでしょうか。
Cでさえもろくに使えないから、C++なんて怖くて手が出ません。
>>709
怖がりすぎー
>C++を使うと例えばどのような解決策があるのでしょうか。

俺も聞いてみたい >>704
std::stringのことだろ。
stringstreamじゃないの?
>>703
プロキシサーバという名前を知らない・・・?
>>714
>>687に言えば。
716デフォルトの名無しさん:03/12/20 10:00
#include<stdio.h>

void increment(int a)
{
*(&a)++;
}

main()
{
int num=10;
increment(num);
printf("%d\n",num);
}


5行目でエラーが出ます。
これ→*
はポインタ変数を宣言しないと使えないのでしょうか?

>>716
関数が意図した動作をしないと言うことは確実に言える。
エラーメッセージをちゃんと読みましょう。
719716:03/12/20 10:06
#include<stdio.h>

main()
{
char a[10];
int b;
for(b=0;b<10;b++)
{
a[b]='Q';
}

for(b=0;b<10;b++)
{
printf("%c\n",*(&a[9]-b));
}
}


でもこういうのはできます。
きちんと入門書買おうね。
void increment(int a)
はint型のコピーを作ってそれを変更するだけ。
呼び出し側の変数の値を変更したいときはアドレスを渡す
>>720
まぁ、入門者をバカにする奴に大した技量の奴はいないわけだが。
北斗の拳風に言うとお前はモヒカンだ。
演算子の評価順序も忘れずにな
723デフォルトの名無しさん:03/12/20 10:13
>>716
(*&a)++;ならOKのはず。
しかしa++;と何ら変わらず、期待通りの動作はしないと思う。
>>721
くだらないこと言ってないでもっと有用なレスしたら?
北斗の拳風に言えばお前に明日を生きる資格はない。

void increment(int* a) {
++(*a);
}

int main(void) {
int num = 10;
increment(&num);
return 0;
}
>>724
++(*a);の括弧はいらん。
(*a)++;なら必要だけど。
>>724
その有用なレスを出し惜しみした理由は?

北斗の拳風に言うとお前は「レイの命は後三日ぁぁぁぁぁぁぁぁぁぁぁぁ!!!」
とか言ってるナレーションのおっさんだ。
>>726
>>720
> 呼び出し側の変数の値を変更したいときはアドレスを渡す

言っているじゃん!
おまえらみんなウサ。
>>728
  ∩∩
 (゜x゜ )○
おっさんじゃなくて千葉繁でしょ。
>>725
++(*a); の方が分かりやすいと思うが。
俺は(*a)++;と書く。まぁどうでもいいが。
732デフォルトの名無しさん:03/12/20 11:03
perl,php,c/c++,javaなんて
オブジェクト指向言語一個と手続き型言語一個覚えていれば
後は少しの調整でつかえるの?
マジレスお願いします
734716:03/12/20 11:23
#include<stdio.h>

void increment(int a)
{
(*(&a))++;
}

main()
{
int num=10;
increment(num);
printf("%d\n",num);
}
引数aには変数numの値(10)が渡ってくるだけなので、この行の「&a」で聞き出してるのは「aのアドレス」でnumとは無関係で、
5行目はa++;と同じ意味になる。(「引数aに渡された値」が増えるだけ)
↑のように考えた理由は↓です。合ってますか?

#include<stdio.h>

int increment(int a)
{
(*(&a))++;
return a;
}

main()
{
int num=10;
num=increment(num);
printf("%d\n",num);
}
>>734
return a+1;でいいと思うが。
>>716 がどういう動作を期待しているのかよく分からんが、
とりあえず実行時のイメージを書いてみた。
(※実際の動作は若干違うところもあるが)

int num=10;
->num にに対してメモリが確保され、値が初期化されている。
(変数名:num, アドレス:999<-仮の値, 値:10)

num=increment(num);
num の値(10)を引数として increment を呼び出す。

void increment(int a)
->a に対してメモリが確保され、値が初期化されている。
(変数名:a, アドレス:123<-仮の値, 値:10)

&a
->a のアドレス(123)

*&a ++ -> *((&a) ++)
->aのアドレス(123)をインクリメントした、アドレス(124)のメモリの値を参照。
しかしアドレス 124 の領域を使う事は許可されていない為、エラー。

(*(&a))++
->a のアドレス(123)のメモリの値(10)をインクリメント。
しかし、そこは num のアドレス(999)ではないので、num の値は変化しない。
737>>734:03/12/20 12:20
もまえの言いたい事はよく分からんのだが
int increment(int a)
{
(*(&a))++;
return a;
}

main()
{
int ret,num=10;
ret=increment(num);
printf("%d <> %d\n",num, ret);
}
ってやると分かる事か?
そんなことをせずとも、
void increment(int a)
{printf("inc:%p\n", &a);}
main(){
int num=10;
printf("main:%p", &num);
increment(num);
}
とやれば判るのでは?
>>736

>しかしアドレス 124 の領域を使う事は許可されていない為、エラー。

見るだけなら問題ないと思われ。
>>739
>見るだけなら問題ないと思われ。

その根拠は?
>>736
a++の値からはアドレスを得られないからエラーになるんだろ。&(a+1)がエラーになるのと一緒。
736が言っているのは*(int *)(a++)では。
ちなみに*&a ++は*(&(a++))
742739:03/12/20 13:25
>>741 ぐっじょぶ

>>740 もまえは'\0'で終わってない文字配列を扱った事が無いな
743741:03/12/20 13:32
*(int *)(a++)じゃなくて*((char *)&a+1)か
おまえ等判ってないだろ……
整数型のアドレスに奇数アドレスを想定するのも馬鹿なら
読み出しはできると思うのも馬鹿。
判ってないならせめて実例を以って検証してから書けよな。
745初心者:03/12/20 14:58
煽り覚悟でお願いするーよ

#include <stdio.h>
int main(void)
{
int i;
int j;

i = 10;
j = 20;

printf("%d+%d=%d",i,j,(i+j));

return 0;
}
これを

""
と表示するように変更したいんだけど、どうすればいいの?
>>744
>整数型のアドレスに奇数アドレスを想定するのも馬鹿なら
アラインメント等を考慮する必要の無い
ハードウエアがあっても全然おかしくないと思うが。
>>745
printf("\"\"");
>>744
Intel 系の CPU 使った事無いだろ。
749初心者:03/12/20 15:18
>>747
ありがとうございます。
>>744
境界またいだときの結果は処理系定義で必ずしも馬鹿とは決まってない
例えば大型機には境界またぐとちゃんと分割アクセスするやつあったし
そういうのは実機で動作確認しても「検証」できたことにはならない
例として適当ではないってことでしょ。
strictly conforming programでないとケチつけられるんなら
ますます実機での動作確認って意味ねーじゃん
このスレはそういうスレだ。
>->aのアドレス(123)をインクリメントした、アドレス(124)のメモリの値を参照。
と書いてある以上、ここでのアドレスは実アドレスではないような
気がするのだが・・・
実アドレスをインクリメントしたら 127(これも処理系依存だが)だろ。
「C言語で学ぶプログラミング基礎の基礎」という本の2日目で、全230ペ-ジ中70ペ-ジぐらいまで来ました。
第1の壁?どうも気になって前へ進めません。どなたか教えて下さいませ。

0=00000000
127=01111111
128=10000000
255=11111111
をunsigned char(0〜255)と思って良いのでしょうか?

char(-128〜127)ですと、
マイナスは8桁め (*-------)が1と思って良いのでしょうか?
-128は2進数でどうなるのでしょうか?
宜しく御願い致します。
>>755
10000000
>>755
環境依存。
-1 = 11111111 の環境もあれば、
-1 = 10000001 の環境もある。
自分の環境がどっちなのかは自分で確かめてちょ。
見た方がわかりやすいな。
こんなふうだ。
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fusu.htm
皆様。ありがとうございました。よくわかりました。
「補数」を理解?するまで時間かかってしまいました。
また宜しく御願い致します。
760デフォルトの名無しさん:03/12/20 19:01
time_t関数をつかっているのですが、
2038年問題にはどう対処したらよいでしょうか?
>>760
30年後の問題を今更考えてどうする?
それまでには誰か頭のいい奴が現れて、
全て解決してくれるさ。
2000年問題はそうやって起きましたとさ。
というか、未来の時刻も扱ってると
もっと早い段階からバグが顔を出してくるな。

それは簡単に解決できる。
今が何周目かというデータも扱うようにすればいいんだ。
もしくは、昔の時刻を扱わないなら、
ある数だけ引いてから使えばいい。
素直に64bitなdateを使う。
>>762
>今が何周目かというデータも扱うようにすればいいんだ。
>もしくは、昔の時刻を扱わないなら、
>ある数だけ引いてから使えばいい。

こういう小細工をしたソフトは機械的名ロジックで対応できなくて面倒なことになるのでした。
>>762
>2000年問題はそうやって起きましたとさ。
って、何が起きたんだ?
2000年バブルとPGの雇用促進だけだろ。
766デフォルトの名無しさん:03/12/20 21:04
>>762
>それまでには誰か頭のいい奴が現れて、
>全て解決してくれるさ。

このことでは
767デフォルトの名無しさん:03/12/20 21:05

ミス
×762
○765
double *p;

size = sizeof(*p);
ってやりたいけど、pがNULLのことがあるのでまずい気がする。
「ポインタが指す要素の型」のサイズを返すように書く方法を教えてください。
>>768
size = sizeof(double);
770デフォルトの名無しさん:03/12/20 21:36
>>768
まずくない。
>>770 じゃないけど調べてみたので補足。
ISO 9899/1999 6.5.3.4 The sizeof operator より。

2. (略) If the type of the operand is a variable length array type, the operand is evaluated;
otherwise, the operand is not evaluated and the result is an integer constant.

オペランドが可変長配列である場合、オペランドは評価される。
それ以外の場合オペランドは評価されず結果は整定数となる。

古い規格のほうがどうなってるかは漏れには参照できないけど。
772デフォルトの名無しさん:03/12/20 22:07
 CとかC++とかJavaってHSPに比べて何がいいの?色々と難しい機能があるみたいだけど、なんの役に立つのか想像もつかない。このキティ厨に教えてくれ。
*pは配列じゃないだろ
>>772
構造化してある。
>>768
sizeofの対象は、実行時にはどんな作用も受けない。
試しに、これやってみろ
printf("%x\n", p);
size = sizeof p++;
printf("%x\n", p);
size = sizeof *p++; /* 動作保証あり */
printf("%x\n", p);
ただしC99にはランタイムsizeofが追加されているが。。。
>>768
double *p=NULL; *p=1.23;とやると落ちる環境で、sizeof(*p=1.23);とやっても落ちないし。
↑double *p = 1.23; なんてありえない。
779777:03/12/20 22:43
いや、やっぱりなんでもない。
780777:03/12/20 22:43
>>778
???
781777:03/12/20 22:45
後半のdouble *p=NULL;は略しただけなんだけど・・・
スリーセブンが一杯。
>>778
代入と初期化を見間違えていると推測してみる。
>>772
HSPのライブラリ拡張がしやすくなる
785768:03/12/21 05:38
>>777>>775
ありがとうございます。*使います。
なんか気持ち悪い演算子ですね…
>>685
ループの中にループが終わったあとの処理を延々と書くことに
違和感を感じないという感覚はリフレッシュしたほうがいいと思うけどなあ。


ループ全体と、それぞれの終了処理を関数にして、

func() {
while(1) {
if(!flag1) return exitLoopProcWhenF1Flase();
if(!flag2) return exitLoopProcWhenF2Flase();
// loop 本体
}
}

でどう?
>>785
気持ち悪くない
ループの「中に」かよ
ループが終わった「あとの」処理なのに...
>>786
終了条件と密接にかかわってるんだから、
別にループ内というかその条件文の中に書くのは構わんと思うが。
複数あった場合なんか、そういうリニアな流れは存在しないし。
俺なら短い場合にはそのままループ内に書くし、
長い場合はループ全体を関数にして、
その戻り値で条件分岐するかな。
>>786
「どう?」といわれても書き方など十人十色でしょう。
終了条件にまた長いループが存在する場合には関数で見栄えを良くするとかなら分かるのだが。
俺の場合、コメントで補ったりするから何回も使わないような処理をいちいち関数にする方が
違和感を感じるな。
まあ、RPGツクールでゲームをつくるような
もんか?
プログラムは、なるべく上から下へ読み下せるようにまとめませう

という、ダイクストラ先生の提案に俺は賛成
一本道ならね...。
お世話になってます。「C言語で学ぶプログラミング基礎の基礎」という本の3日目で、全230ペ-ジ中82ペ-ジぐらいまで来ました。練習問題の答えがあいません。なぜでしょうかどなたか教えて下さい。

問:40000という整数を代入できる変数のデータ型は何ですか?
答:long型かunsigned long型です。

なぜ「long型かunsigned int型」とならないのでしょうか?
どなたか宜しく御願い致します。
>>795
代入できるのが保障されてるのは long と unsigned long だけかもしれんが、
別に今の時代大抵 int や unsigned int, unsigned short にも代入できるので
そこまで深く考えなくてもいいかと。
>>795
float,doubleにも40000代入できるよ。
>>795
その問題に回答するにあたって
問題文でintのサイズをどのように仮定しているのか
具体的な値か特定の処理系かがわからなければ

「問題文そのものが意味不明」が正解
代入「できる」とは、どういうことかの定義も必要。
代入「できて」も結果が未定義の場合がある。
int型 〜32767
unsigned int型 〜65535
long型 〜2147483647
なので「unsigned int型以上」ですよね。
>796さん。
深く考える事ができないのでアホな疑問が浮かんでばかりです。(汗
皆様。ありがとうございました。
>>800
その本かなり古くない?
以下のC言語のプログラムはコンパイルエラーになる。
どのように間違っているのか説明せよ。

int hoge(int a) {
  int r;
  if (a == 1)
    func1();
    r = func2();
  else
    r = func3();
  return r;
}

という問題に
「else に対応する if が無い。」
と書いたら×だった。

なんて書けばよかったんだ?


int hoge(int a) {
  int r;
  if (a == 1){
    func1();
    r = func2();
  }
  else
    r = func3();
  return r;
}
>>794
一本道になるように関数に分割すべきでない?
決められてるのならしょうがないけど。
後学のために、分割できないケースを教えてほしい。
>>802
if文などで複数のステートメントを実行する場合はまとめる為のコードブロックが必要
だが>>802の答えでもあっていることはあっているな。
807806:03/12/21 17:47
というか、、、コンパイラはそういう理由でエラーを出すと思う、、、
>>802
単にその講師が馬鹿だっただけでは?
>>800
>int型 〜32767
>unsigned int型 〜65535
半分間違ってるよ…。
>>796>>798をよく読もう。
ちなみに、
short int <= int <= long intです。

常識書いてすんません。
>>809
間違ってるのか?
寧ろ>>809が間違ってない?
short <= int || int <= long
(;´Д`) '`ァ?
813687:03/12/21 18:51
>>714
プロキシサーバと書くと誤解を招くおそれがあったので、
そう書きました。
>>811
それのどこが>809と違うの?
SHORT_MAX <= INT_MAX && INT_MAX <= LONG_MAX
だとおもうヨ
手元の辞典によれば、

数量的限界は
unsigned char <= unsigned short <= unsigned int <= unsigned long
signed char <= short <= int <= long
の順で、

char の限界値の制限は
CHAR_MAX >= +255 or +127
CHAR_MIN <= 0 or -127
(左は char が符号なしのとき、右は符号ありのとき)
UCHAR_MAX >= +255

int の限界値の制限は
INT_MAX >= +32767
INT_MIN <= -32767
UINT_MAX >= +65535

short の限界値の制限は
SHORT_MAX >= +32767
SHORT_MIN <= -32767
USHORT_MAX >= +65535

long の限界値の制限は
LONG_MAX >= +2147483647
LONG_MIN <= -2147483647
ULONG_MAX >= +4294967295

と書いてある。
つまり、40000 を代入し、40000 という値を保持することが
どの環境でも保障できる型は
unsigned short, unsigned int, long, unsigned long の4つってことか?
今の環境では
 int = 4バイト(-2147483648〜+2147483647 : 0〜+4294967295)
 short = 2バイト(-32768〜+32767 : 0〜+65535)
 long = 4バイト(8バイトもたまにある)
なのが普通だが、10年くらい前は int = 2バイトが普通だったな。
古い本だと int = 2バイトを仮定して書いてあることが多い。
>>818
落とした(タイーホ)MS-DOS用のボーランドのコンパイラはint=2バイトだったな。
>>818
現役の16bitプロセッサなんてごろごろしてると思うが。
>>815
さらに SHRT_MAX < LONG_MAX
>>811
そこは&&だろう…
それじゃintが1バイトでも真になるぞ
>>821
<=じゃなくて?
>>817
間違ってます…。

えっと、int型は処理系よってもっとも
計算しやすい単位で、システムバスのバス
幅と等しい伝送量と同じです。

16ビットPCなら、
 short int == int
32ビットPCなら4バイトが型の
long int == int
となります。なので64ビット
PCが出れば……………。
新しい型でもできるのでしょうか?

ちなみに俺はPG歴、1年のひよっこ
なので間違ってたら訂正願いますね。
>>824
>>817はなんかちがうのか?
>>824
まず前提に short は16ビット以上,long は32ビット以上というのがあるので
>>817 は間違ってない
827824:03/12/21 21:19
>>817
すいません。
間違ってません。なんか勘違いしてました。

ちなみに
>システムバスのバス幅と等しい伝送量と同じです。
という発言もうそでした。

32ビットPCのほとんどのパソコンの、システム
パスのバス幅は64ビットっぽいです。

辞書調べたら、int系はCPUの演算処理単位に依存す
るとのことです。
>>824
更に間違い。
32ビットPCのバス幅が殆ど64ビットというのはどこからきた戯言だ?
逆に、64ビット機でも移植性の問題から
int を 32ビットで扱うことがあるというのは聞くね。
>>827
ヒゲの意図としてはintはレジスタサイズと言いたげに見えるが
こんにちそれは何の拘束力も持っていない

intが8bitの処理系もあるが
ANSIがダメと言っても俺は応援する
規格は紙だが神じゃない
あくまで付き合い方が肝心
規格はインクだ!
832827 恥の上塗り:03/12/21 22:16
>>828
え、違うんですか。
現在のマザーボードで主流の規格がATXとか、
microATXなんで、64ビットバスが主流かな〜
と思っただけです。
なんか板違いなような気がするので逝きます
…。
メモリ2枚差しとか色々あるよな〜www
>>831
会社じゃねーだろ
と、くだらねえ突っ込みのマネをするテスト
>>819
>落とした(タイーホ)MS-DOS用のボーランドのコンパイラ
法を犯さなくても、普通に某(米)のHPから、落とせたと思うけど?
>>835
DOS用だぜ?
NTコンソールと違うぞ
リアルモードで動くやつ
どっかにあるのか?
過去ログ増えてきたんで、今まで保存していたログ全てをまとめ
インデックスを付けてみました。(ひょっとして、もう既に誰かがやってたらごめんなさい。)
ただ、一部の過去ログは参照できないため、所持している方がいれば追加お願いします。

新スレ時のテンプレに加えて頂ければ幸いです。
00tech_index.htmlがインデックスになります。
http://up.isp.2ch.net/up/f466de51139f.rar
バイナリエディタでマシン語直打ち最強伝説。
>>837
神降臨?
840837:03/12/21 23:41
>>839
恐らく8割は入ってると思います。
59〜54と1〜4がありません。
重複スレはできるだけまとめましたが、乱立した時期があったので
全てをまとめきれませんでした。
メモ帳とかでC言語を書いてみたんだけどそれをVC++でコンパイラできますか?
VC++はVC++で書いたC言語しかコンパイラできないんですか?
やっぱりgccなどのコンパイラソフトはインストールしないといけないんですか?
質問ばかりですみませんがお願いします。
>>841
【独習C】猿55【猿C言語教室 part2】
http://pc2.2ch.net/test/read.cgi/tech/1070778819/l50
ここの>>3にあるエディタとコンパイラを使うと良い。
フリーだからタダで使える。
どうもです。
でも体験版みたいですね。
一様試してみます。ありがとうございました。
>>841
Shift-JIS のプレーンテキストで書いてあれば何でもいいけど
(まぁ、要するに普通にメモ帳使って作ったテキストファイルと同じ形式)、
Word とかで作って「コンパイルできなーい」というのだけは勘弁な。
いや、VC++でもできるだろう。
なにがしたいのかイマイチわからんけど、たぶんcl
あとはググれ
>>837
解凍できないんだけど、
LHUT32 + UNRAR32.DLL Ver 0.08
Lhaplus Ver.1.22
両方ダメだった。
>>841
こんちわ世界プロジェクトっぽい奴にCの外部のソース追加して...って事ぢゃない?
>>826
そんな決まりは無い。
といっても、それに該当しない処理系を見たことはないが。

>>836
ここだな。
ttp://community.borland.com/museum/
BCも配って欲しいのう。
>>824

無茶無茶細かい突っ込みでスマンが

>えっと、int型は処理系よってもっとも
>計算しやすい単位で、システムバスのバス
>幅と等しい伝送量と同じです。

規格にはそんな要請はなかったと思う。

ただし、処理系をそのように実装するのが自然だし規格もそれを許してるし、
実際そのようになってない処理系をおれはしらん。

別に64bitCPUでintが16bitの処理系があっても構わない。
そういう実装になっていても規格には違反しない。

# もっともそんな処理系を使いたいとは思わないけどね。
>>851
64bitCPU用でintが32bitというのはあるけどね。
intが32bitだと思いこんでいる人(というかそう書かれたコードか?)に合わせたらしい。。。
て言うか今の時期intは使用禁止だな。
>>852
あるけどね、っつーか
Unix 系でも Win でも int は 32bit ですが。
intは…CPU依存でもOS依存でもなく、コンパイラ依存ではないでしょうか。
UNIXでもWinでもと言われましても、えぇ、困ってしまいますね。
LP64 int-32bit long/ポインタ-64bit
ILP64 int/long/ポインタ-64bit
LLP64 int/long-32bit long long/ポインタ-64bit

intが32bitっていうか、一応指針がある
857837:03/12/22 12:27
>>847
zipであげ直してみました。
質問する前の過去ログ参照、検索用にお使い下さい。

http://up.isp.2ch.net/up/f2594bf9bc0e.zip
16.7MB(^o^;)
昔の頃のテンプレは懐かしいな。
voidのあれをすすめているところとか。
>>857
ありがとう。ゴチになりました。
>>858
?
4.17MBだったよ?
>>861
展開後
cdeclとstdcallの違いを教えてください。

cdeclは呼び出し側でスタック開放
stdcallは呼び出された側でスタック開放

両者の場合stdcallは複数の場所から呼ばれた場合
スタック開放処理が呼び出された側にあるのでプログラム
サイズが小さくできると"プログラムはなぜ動くのか"
という本に書いてありました。

では、なぜすべてstdcallではないのか?
stdcallのデメリットとは?cdeclのメリットとは?
なんなんでしょう?
>>863
可変長引数のことを考えてみれ
>>862
なるふぉど。
他の人のCのソースを
見たいんですけど、
お勧めのサイトってないですか?
PDSとかでググっても見つからない…
その手の会社でアルバイトしたら?
>>864
難しいです。
だったら可変長引数を使わない関数は
すべてstdcallにすればいいのでは?

可変長引数以外のメリットは?
難しいので教えてください。

型チェックがなんたらとか、
x86固有の仕様とか書いてあったんですけど
いまいちわからないです。
>>864
どうでもいいが、可変「個」じゃねーの?
>>870
どっちでも意味通じるからいいんじゃね?
正式名なんて聞いたことないし
JISでは可変個数
>>868
>だったら可変長引数を使わない関数は
>すべてstdcallにすればいいのでは?

#include <stdio.h>
int __stdcall f0(int a){return a+1;}
int f1(int a){return a+2;}
int (*ft[])(int)={f0,f1,};
int main(void){printf( "%d %d\n", ft[0](10), ft[1](10)); return 0;}
遅くなってすみません!「C言語で学ぶプログラミング基礎の基礎」という本の4日目なのに82ペ-ジとまりです。
>>800さん。皆様。
この本は矢沢久雄著ナツメ社で、2002年10月15日初版、2003年5月20日第2版発行です。
>>皆様。
超々初心者用の本なのか、処理系が(?)LSICだからなのか、
データ型は、char(-128〜127),int(-32768〜32767),long(-2147483648〜2147483647),unsigned char(0〜255),unsigned int(0〜65535),unsigned long(0〜4294967295),float(約±10の-38乗〜約±10の38乗,有効桁7桁),double(約±10の-308乗〜約±10の308乗,有効桁16桁)との事。

都合で24時間程来れませんでした。なんか、、、感謝です。ありがとうです。
2000円も払ったし年内はこの本を制覇。新年からは御推薦のK&Rに挑戦しようかと思ってます。
皆様、今後とも宜しく御願いします。
>>866
見るだけならPDSじゃなくてもいいだろう。
本物のPDSなんて、そうは見つからない。
>>837
いただきました。
初心者質問ですがお願いします。あるサイトで
char a[3];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
printf("a = %s\n", a);
だと「a = abc78e」とかが出力される時があるので(aがどこで終わるか判らないからとの理由でした)
char a[4];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c'
a[4] = '\0';
printf("a = %s\n",a);
とするとあったのですが(\0は終わりの意味なのでとの理由でした)その後の回で
char b[7] = "Hello!";
printf("%s\n", b);
とするとあったのですが(出力結果は「Hello!」と出ていて「ほら、出ましたね♪」みたいに書かれてました)
何故hello!の方には\0がないのでしょうか。当たり前のようにそこには説明がなかったのでどなたかお願いします
>>879

そのサイトには "Hello!" がメモリ上でどのように表現されるかについて
説明してありませんでしたか?
>>879
"Hello!"は文字列リテラル(定数)で'\0'が付加されているから
>>880
メモリ上?書いてないと思います。一応url貼ってみます。
abcの方
ttp://www.geocities.co.jp/SiliconValley-Bay/8490/c/c_012.html

Hello!の方
ttp://www.geocities.co.jp/SiliconValley-Bay/8490/c/c_013.html
>>882
糞ページに騙された藻前の負け。
>>881
よく判らないのですがまとめて初期化すると"\0"が自動的に付加されるという事ですか?
char b[7] = "Hello!" …ここでは文字列bを宣言し、なおかつ文字列bにHello!と文字を入れています。
→このように変数宣言と同時に変数に値(文字も)を入れてしまうことを俗に初期化といいます。

( ゚д゚)ポカーン
初心者がCの入門書でも読みながら書いたようなページだな。
しかも頼りの虎の巻であるところの入門書を読み違えてる。
このページで勉強は止めた方が良いって事でしょうか。
初心者にはどのページがよくてどのページが悪いかの判断も出来ないのが辛いです・・。
「C言語」で検索しても物凄い数のサイトがヒットしてその中から初心者用ページを探すのも辛いし。
他探してみますありがとうございました
char配列の初期化の時はそれが許される
889デフォルトの名無しさん:03/12/22 23:05
a++と++aの違いを教えてください

int a=5, b;
b = ++a;
printf("b=%d ++a=%d\n", b, a);

int a=5, b;
b = a++;
printf("b=%d a++=%d\n", b, a);

でbの出力結果が違うのは何故ですか?
++は「1プラスする」の意味だと思っていたのですが
それなら何故下の例のbの出力が5になるのかが判らんです
ここそんなに酷いサイトか?
>>887
とりあえず、文字列リテラル 初期化 あたりで検索すれば?
書いた本人は理解しているのかもしれないが、
他人に説明するだけのスキルがない。
特に日本語がなっていない。
「俗に」とか「当たっている」とか、言葉の選び方が適切とは言えない。
>>887
とりあえず本を買いましょう。
Amazonあたりでレビューを見てよさそうなのを探して、それで勉強しよう。
ネットで探せばいくらでも勉強できるけど、正しいかどうか見極める目が
必要となるからね。本買った方が楽できるよ。(良い本を選べばね)
それで本の中で理解できない事を詳しく知りたいと思ったらネットを活用
すれば良い。
それでもつかめないときはココへきて諸先輩方の意見を仰ぐのもいいだろう。
>>889
処理をした後にプラスする。
処理をする前にプラスする。
896デフォルトの名無しさん:03/12/22 23:29
>>895
超判りやすかったです。ありがとうございました
897答えにはなってないけど:03/12/22 23:29
char a[]="abc";

char a[3];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
は別物ですよ。

ちなみに、
char a[];
a = "abc";
はエラーです。
898デフォルトの名無しさん:03/12/23 05:50
>>895
後置の時に代入が先に行なわれたら
演算子の優先順位がに矛盾してない?
麻奈本あがりですが、よろしくお願いします。
>>898
a++の動作を強引にCで説明すると(エラーだけど)

a++{
 return a;
 a = a + 1;
}

こんな感じ
「= >> ++」だったら未評価の演算子を代入しないといけないでしょ
>>873
int (*ft[])(int)={f0,f1,};
error C2152: 'initializing' : 関数へのポインタの呼び出し規約が違います。
コンパイラ エラー
ある呼び出し規約 (__cdecl、 __fortran、 __pascal 、 __fastcall のいずれか)
で宣言された関数へのポインタを他の呼び出し規約で宣言された関数への
ポインタに代入しようとしました。

変更
int __stdcall (*fp0)(int)=f0;
int (*fp1)(int)=f1;
error C2059: 構文エラー : '('

解った事
・stdcall呼び出しの関数とcdecl呼び出しの関数は違うので同一の
関数ポインタに入れられない。
・stdcall呼び出しの関数ポインタを作れない。
これであってますか?
わかんないです。
fp1も_stdcall宣言してやれば医院で内科医?
>>900
int tmp = a;
a = a + 1;
return tmp;

の方がいいと思われ。
>>901
int (__stdcall *fp0)(int) = f0;

それはともかく、いちいち __stdcall を付けるのは
面倒というか、移植性も低くなるし、
そんな雀の涙ほどのサイズの違いは今時普通問題にならないので、
基本的に __cdecl な関数のみ作るべし。
__stdcall な関数を引数に取る関数が出てきたときだけ
__stdcall にすべし(たとえば Windows のウィンドウプロシージャとか)。
>>901
__stdcall int (*fp0)(int)=f0;
>>868
int hoge();

    :
  hoge(1, 2);
    :
  }

  int hoge(arg)
    int arg;
  {
    return arg;
  }

こういう事も出来てしまうんで、結局引き数が幾つあるかは
呼び出し元にしか判らないと。
910909:03/12/23 17:30
ありゃ、K&R で書いちゃった…_| ̄|○

  int hoge(int arg)
  {
    :

でも一緒だけどね。
そういう仕様自体が悪な気もするけどなー。

まぁ、古い言語なんでいろいろとアラがあるのは
仕方が無いねー。
>>911
HSPは新しいですがツッコミどころ満載ですよ。
>>912
あれは言語じゃないでしょ…
どっちかっていうとプログラムツクールって感じで
HTMLを言語とぬかすよりはマシだろう。
HSPとはいえ、一応アルゴリズムを記述していくんだから。
Hyper-Text Markup "Language"
HTMLは言語だよ。プログラム言語ではないけどね。
マークアップ言語!
言語を言語と認められない香具師が使えばどんな言語も活きる訳がない。
>>910
そのケースではたまたま同じだが、
int foo(float arg){return sizeof arg;}

int foo(arg)
float arg;
{return sizeof arg;}
は違う結果を返す。
質問です。
整数がスペースをはさんで各行10個ずつ並んだa.txtファイルを入力として
(例:6 43 2 5 34 12 0 456 32 100)←一行分
その数字をint型の配列に順に入れたいのですが、どのようにすればいいのでしょうか?
手抜きでよければ

int a[10];
for(i = 0; i < 10; ++i) {
 fscanf(file, "%d", &a[i]);
}
>>921
間のスペースってちゃんと処理されるの?
ちゃんと処理される。
924920:03/12/23 22:36
ありがとうございました。
「プログラミング言語」を定義せよ >>913,915,916,918,free_entry
void mystrcpy(char *to, char *from)
{
while(*from) *to++ = *from++;
*to = '\0'; /* ヌルで終わる */
}

void mystrcat(char *arki, char *plus)
{
while(*arki) arki++; /* arkiに指されるアドレスの最後までぶっ飛ばす */
while(*plus) *arki++ = *plus++;
*arki = '\0';
}

こんな感じで、mystrlen(自作strlen関数)を作ろうとしたんですが、挫折しました・・・・
どうしたらいいでしょう・・・・
>>926
mystrlenないじゃん
int mystrlen(const char* s) {
 return !*s ? 0 : mystrlen(s + 1) + 1;
}
#include <stdio.h>
void mystrcpy(char *to, char *from); /* proto */
void mystrcat(char *arki, char *plus); /* proto */
int mystrlen(char *sent); /* proto */

int main(void){
char str[100];
int length;
mystrcpy(str, "Welcome back.");
printf(str);
printf("\n");
mystrcat(str, " Mr.Anderson...");
printf(str);
length = mystrlen(str);
printf("%d", length);
return 0;}
void mystrcpy(char *to, char *from){
while(*from) *to++ = *from++;
*to = '\0'; /* ヌル終端文字で終わる */}
void mystrcat(char *arki, char *plus){
while(*arki) arki++; /* arkiの最後のアドレスまでぶっ飛ばす */
while(*plus) *arki++ = *plus++;
*arki = '\0';}
int mystrlen(char *sent){
int len=0;
while(*sent) len++;
return len;}
#include <stdio.h>
void mystrcpy(char *to, char *from); /* proto */
void mystrcat(char *arki, char *plus); /* proto */
int mystrlen(char *sent); /* proto */

int main(void){
  char str[100];
  int length;
  mystrcpy(str, "Welcome back.");
  printf(str);
  printf("\n");
  mystrcat(str, " Mr.Anderson...");
  printf(str);
  length = mystrlen(str);
  printf("%d", length);
  return 0;}
void mystrcpy(char *to, char *from){
  while(*from) *to++ = *from++;
  *to = '\0'; /* ヌル終端文字で終わる */}
void mystrcat(char *arki, char *plus){
  while(*arki) arki++; /* arkiの最後のアドレスまでぶっ飛ばす */
  while(*plus) *arki++ = *plus++;
  *arki = '\0';}
int mystrlen(char *sent){
  int len=0;
  while(*sent) len++;
  return len;}
931926:03/12/23 23:56
2重スマソ
上のように書こうとしてました。

>>928
すいません・・・私の理解を遥かに超えています・・・・
何とかして、mainの中のlengthに、mystrlenからstrの文字数を返したいんですが・・・
全然表示してくれません・・・・
諸兄方のアドバイスを頂けないでしょうか・・・
>>931
再帰呼び出ししてるだけ。
s の先頭が '\0' ならば文字列の長さは 0
s の先頭が '\0' じゃないならば、s の次の文字から数えた長さ + 1 が文字列の長さ

で、関数の中でローカル変数を作りたくないってわけじゃなければ、

int mystrlen(const char *s)
{
int len = 0;
while(*s++) { len++; }
return len;
}

とか。
>>933
ありがとうございますッ!
出来ましたッ!

ふー、これでようやく独習Cのポインタの章が終わったっす・・・・
935デフォルトの名無しさん:03/12/24 01:22
下のような構造体で線形リストを組んでいるのを見てしまいました。
一応そこの環境ではちゃんと動いているのですが、少々疑問が残りました。

1. 構造体の1番目の要素と構造体のアドレスって同じものとしても良いの?
2. バイトオフセットを使用するためにchar *型にキャストするのは普通?
  そもそもそんな使い方は一般的に行われているのでしょうか?
3. 構造体のアドレス+sizeof(Node)で、valueのアドレスとして良いのか?
  (Node構造体の中でパディングされるようなので、良いような気もするのですが…)
4. そもそも、線形リストってこういう実装するものなの?

私から見るとかなり変態的に思えるのですが、まだまだ勉強が足りないのですかね…
特にchar*にキャストしているのとか、個人的にいろんな意味で驚きでした。
936935:03/12/24 01:23
(すみません、コンパイラが手元に無いのでちゃんと通るかわからないのですが
雰囲気をつかんでいただければ。)

#include<stdio.h>

typedef struct _Node{
struct _Node *prev;
struct _Node *next;
}Node;

typedef struct _Structure{
Node node;
int value;
}Structure;

int main(void)
{
Structure structure;
Node *node=&structure.node;

*(int *)( (char *)node + sizeof(Node) ) = 100; //structure.valueに数値を代入

printf("%d\n",structure.node);
return 0;
}
Node に value を入れろよ...。
> printf("%d\n",structure.value);
なんだこれ?
939935:03/12/24 01:59
>>937
それは4.への回答ですね。
良心的に解釈すると、Structure1, Structure2みたいなのを定義して使用するときでも
リストをたどる操作を共通化できるように、みたいな考えがあるのかな、とも思ったのですが…

>>938
すみません。printfのところは
printf("%d\n",structure.value);
の間違いです。
ちゃんとvalueに値は入ってるね、という確認のため書いてみました。
C言語入れたら自動的にフローチャート作るフリーソフトってないのか?
>>940
マルチうざっ。
コピペ厨なら氏ね。
すぐに作れそうな気がするが。
制御構造だけなら適当に文字照合してやればいいんでは?
>>939
Structure* にキャストして value を使うのが正しい。
または、offsetof(Structure, value) を足すとか。

こういうのはリストをたどる操作は共通化できるけど、
その代わり使いにくい気もする。
C++ で言うテンプレートってのを
マクロを使って実現するのが手っ取り早いかも。
>>935
構造体の1番目のメンバーのオフセットは0と見ていいと思うが
Cの仕様には明示されていないような・・・断言は出来ない
構造体の中に他の構造体があって

a->b->c

こんな感じでアクセスするのって出来るのでしょうか?
出来るけどやってはいけないのでしょうか?
>>935
1. 構造体の1番目の要素と構造体のアドレスは一致する
2. バイトオフセットを使用するためにchar *型にキャストする
  がそんな使い方はmemset()とか使う際に一般的に行われている
3. 構造体のアドレス+sizeof(Node)で、valueのアドレスとして良い
  (Node構造体の中でパディングされる)
4. そもそも、線形リストってこういうは実装しない
>>945
できる
948デフォルトの名無しさん:03/12/24 03:15
問題なく出来る。
でも、cが構造体の要素なら、a->b.cとかになるはずだがね。お分かり?

ただ、a->b.c++とかやらせるとコンパイラがバグったコードを吐いたことが
あるな(gcc 2.96あたり)。
a->b.c = a->b.c +1 なんて素直に書いたことがある。
>>947
早いレスでどうもありがとうございました
>>946
3. に意義あり。
node と value の間にパディングが入ることを
規格は禁止していない。
実際

typedef struct A_ {
 char c;
} A;

typedef struct B_ {
 A a;
 int i;
} B;

の時、sizeof (A) != offsetof(B, i) になる場合が多い。
>>948
あ、確かにそうですね
ポインタばっかりだったのでついそうかいてしまいました。
そのへん注意しますです
>>950
あほか
それは別の問題

struct B_ {
 A a;
 int i;
} *p,B[10];
p=B;
で (p+sizeof(struct B_))==&B[1] という話だろが

>>948
>>951
struct A_ {
 char c;
} ;
struct B_ {
 A *b;
} *a;
a->b->c でつが、何か?
954953:03/12/24 03:38
訂正
struct B_ {
 struct A_ *b;
} *a;
>>953
あー、わけわかんなくなってきた・・・
つまり手法自体はOKであとは良く考えて使いましょうと
>>952
あほはお前じゃ。
そっちこそ別の問題だ。
元の問題をディスプレイに穴が開くほど見て来い。
>>955
struct A_ {
 char c;
};
struct B_ {
 A a;
 A* p;
};
struct B_ b;
struct B_* p;
の時、
b.a.c, b.p->c, p->a.c, p->p->c が有効。
何てこたぁない。
b.a, p->a がポインタじゃないから b.a.c が有効だし、
b.p, p->p がポインタだから b.p->c が有効ってだけだ。
>>953 と同じ間違いやっちゃったーよ...。
struct B_ {
 struct A_ a;
 struct A_* p;
};
>>952
はあほ

>>956
は別の問題
struct _Node{
struct _Node *prev;
struct _Node *next;
};
の後ろはアライメントされてる
960944:03/12/24 04:41
スマン、先頭の要素の前へのパッティング挿入は駄目だから
>>946のとおり、構造体の1番目の要素と構造体のアドレスは一致するで正解だな。
一応フォロー入れておくけど、
>>952 の言ってること自体は正しい
(p の char* へのキャストが足りない点を除いて)。

ただ、それは今考えてる問題とは全く別の問題だ。
必死だな(´,_ゝ`)プッ
>>945
リンクリストを作るときにやったな。
list->prev->next=list->next;とか。
自己参照型だからlist->prev->next->prev->next・・・・と無限にできるな。
>>964
Cの関数、例えばgetsはGetStringの略ですよね?
こういう「この関数は○○と言う英語の略」って言うのが沢山載ってるサイトありませんか?
関数だけだと覚えにくいので、意味と一緒に覚えたいんです。
>>966
大半は見れば分かるし、
見て分かんないもんは略さなくてもよー分からんかもしれん。
でもまぁ、一応 man 見れば何の略かは分かると思う。
http://www.softlab.ntua.gr/cgi-bin/man-cgi
そういや C 始めた頃、「strtok」が何の略だか悩んだ事があったなぁ。
「string to Kナントカ」に違いないと思い込んでたから
動作と結びつかなくて。
strspn とか何の略なのか分かっても
機能を覚えれない。
>>966
「ANSI C言語辞典」辺りを買ったらどうよ?
strrchrの二番目のrはreverseらしいね。
revくらいにしておけばいいのに。
そんなに長くするとシンボルが8文字で切られる環境で使えなくなります。
今時そんな環境は無いと思うが。
>>970
平林 雅英著、だな・・・

宣伝か?
>>972
>そんなに長くするとシンボルが8文字で切られる環境で使えなくなります。
>今時そんな環境は無いと思うが。

制限速度を頑なに守る警邏中のパトカーと同じだな。
環境というよりも、自分で決めた縛りを自分で守らないのは意味が無い。
あれ?成立順序は逆か?
>>971
名前の一貫性がなくなる
976 :03/12/24 19:52
バイナリモードでファイルをオープンしてもfgetcやfgetsは正常に使えるのですか?
改行文字が\r\nのときでもそのままの文字列がほしいんです。
>>976
テストくらいすぐできるだろ
互換性、互換性、と金切り声でわめく若い奴によく見られる傾向は?
# なんか今日はサドっ気出ないんで、疑問文の形にしてみた
>>978
つか、今日は調子悪そうだな。何が言いたいのかサッパリだ。
980 :03/12/24 21:38
>>977
自分の環境では正常にうごいたけど、これが標準の仕様なの?保証されてるの?
推奨されていないとかないかな?
あと一文字づつ順に呼んでいくならfreadを繰り返し使うよりfgetcのほうがやっぱり効率いいのかな?
freadでもシークを呼ばずにくり返し呼ぶだけなんだけど。
明らかに >>977 より >>976 の方が優秀だな・・・
お世話になってます。「C言語で学ぶプログラミング基礎の基礎」という本の6日目で、全230ペ-ジ中109ペ-ジぐらいまで来ました。

a = b > 1 ? 2 : 3;
を「高度なので存在を知っておくだけでよい」との事なのです。気になって・・・
予想では「bが1より大きければaを2とし、違ったらaを3としなさい。」なのですが、どうでしょうか?どなたか教えて下さい。宜しく御願い致します。
>>982
その本には、その名前も載っていなかったのか?
>>980
(前半部分) ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html
自分のコンパイラのマニュアル等も見て判断したら?
というか、ちゃんとテストしてみたのか?
(後半部分)だから、テストコード作ってテストしろよ
>>981
低脳な人は書き込まないようがいいよ。すぐボロがでるからね。
>>980
fread でバッファリングするのが速い。
>>982
あってる。
A ? B : C は、A が真のときは B 、A が偽のときは C になる。

あと、別に高度でもなんでもないと思う。
if 書くと冗長になるときに便利。
>これが標準の仕様なの?保証されてるの?
と問われているのに
>コンパイラのマニュアル等も見て判断したら?
と回答するのはかなり的外れな回答かと。
マニュアルにはその機能が標準かそうでないかを
書いてある場合があるぞ。
989982:03/12/24 22:36
>>983さん。
「特殊な演算子の種類」として、
演算子名「?:」、機能「if〜else文の省略形」、使用例「a = b > 1 ? 2 : 3;」としか載ってません。
超々初心者用の本みたいです。
990982:03/12/24 22:40
>>986さん。
ありがとうございました。安心しました。
初心者本買うと著者になめられる?
>>989
>機能「if〜else文の省略形」
間違い。参考演算子にできてif文にできないこと、或いはその逆がある。
せめて、「〜を数式内で使うための妥協の産物」くらい書いて欲しいもんだ。
「三項演算子」ってのは名前じゃないな。
「二項演算子」が名前じゃないのと同じぐらいに。
「条件演算子」かな。
ttp://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&q=%E6%9D%A1%E4%BB%B6%E6%BC%94%E7%AE%97%E5%AD%90&lr=lang_ja
残りも少ないから雑談しようぜー
メリークリスマース
ハテナ演算子w
ウチのところじゃ使うのを禁止されてるよー
可読性だのなんだのと…ま、禁止されてなくても使わないけどね。
islower(c) ? toupper(c) : tolower(c);

if (islower(c)) putchar(toupper(c));
else putchar(tolower(c));
>>992の検索の一番上のサイト。
Cの書き方に「正しさ」を求めているあたり終わっている。
C1000takeda
>>999
プッ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。