C言語なら私に聞け! Part 66

このエントリーをはてなブックマークに追加
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 65
http://pc2.2ch.net/test/read.cgi/tech/1064234533/
2デフォルトの名無しさん:03/10/19 19:51
【コンパイラ】
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
誰か「よくある質問集」を作ってよ
質問なんですが
ヘッダーファイルにユーティリティー的な関数書いて
置いて置くのはOKですか?
externとか毎回書くより
#include "hoge.h"の方が,いいのではないかと最近思い始めたんですが・・・
ファイルの内容を全部読こんで処理したいのですが、
そのファイルの内容を入れる文字列の長さを100000とか必要なだけ取ろうとするとエラーが起きてしまいます。
何かいい方法ありますか?
真偽を表す型はないのですか?
int とかの0とそれ以外で分けるのがC言語の常識なのですか?
boolとかbooleanとかいう型は無いでしょうか?
お願いします。
>>4
常識

>>5
最後に\0入れるんじゃないの?

>>6
intでOK
正常終了exitと異常終了abortとの違いはなんでしょうか。

自分で調べたところでは、abort関数はデバッグ作業時に使う関数であり、
どこで、どんなエラーが発生したかを示してくれるということらしいのですが、
そういう目的が無ければ別にexit関数を使えばよいということなのでしょうか。

例えば想定以上のデータが来たときに終了させる場合はどちらで終了させる方がよい
とかってあるのでしょうか?
地方のとある高校3年です。
実は仲間内で数学研究をし、もう少しである法則を発見できるかも知れないのです。
そのある簡単な調べをするためにCでDOSに表示した文字列をテキストに出したいのですが、
簡単にはできないのでしょうか?
仲間の中でそのような能力を持った人がいなくて困ってます。
なんとかprintfやfor、if等は理解したのですが・・・。
よろしくお願いします。
> CでDOSに表示した文字列をテキストに出したいのですが、

意味不明です。
FILE* fp=fopen("ファイル名","w");
fprint(fp,"文字列");
>>4
> externとか毎回書くより
> #include "hoge.h"の方が,いいのではないかと最近思い始めたんですが・・・

その理由を 50文字以内で書いてください。

>>5
環境と、エラーメッセージを書いてね。

>>6
bool, boolean はない。
int で代用。

>>8
どっちの可能性もある。
環境とか、仕様とか次第。

>>9
釣りにしては、ちょっと無理がある。
出直してこい。
あごめん、リダイレクト使えばいいのか

C:\???>a.exe > hoge.txt
145:03/10/19 22:57
OSはwin2000でvc++で作っています。

#define NUM 50000
char str[NUM];

こんな感じで、NUMを50000だとコンパイル→実行できるのですが、
NUMを500000にするとコンパイルはできるんですが実行すると

例外 unknown software exception (0xc00000fd) がアプリケーションの 0x004040a7 で発生しました。

とエラーが出て落ちてしまいます。
>>14
スタックオーバーフローだろうな。
char str[NUM] をグローバルでとるか、malloc() でとるか、スタックサイズを指定してみそ。
165:03/10/19 23:09
なるほど、グローバルでとるのが簡単そうなのでやってみます。サンクス!
>>4
まさか、ヘッダファイルに関数を直書きする気じゃあるまいな?
前スレに乗り遅れた。で945の
char* c1="abcdefg";
これもいい加減、伝統を無視してコンパイラはワーニング出すべきだよなぁ。
const char * c1 = "abcdefg";
なにか違う気が・・・
Q なんで「俺に聞け」じゃないの?
A うっかりコピペしてミスった。

Q 名前欄の「v(^o^i)d」は何?
A シラネ

Q 「質問する前には最低限検索を。」ってどこで検索すればいいの?
A Google( http://www.google.co.jp )とかYahoo!( http://www.yahoo.co.jp/ )とかで。

Q 標準Cとやらでできるかどうか分からない場合はどうすればいいの?
A とりあえずここで聞いてみる。おそらく住人が適切なスレッドに誘導してくれる。
Q 「ソース丸投げ、宿題、書籍 は専門の別スレがあるので」って、どこにあるんだYO!?
A ソース丸投げ、宿題 : http://pc2.2ch.net/test/read.cgi/tech/1064541405/
  書籍 : http://pc2.2ch.net/test/read.cgi/tech/1060693125/

Q 「上記を逸した場合の結果は激しく未定義だYO!」と言いますと?
A 何が起こるか分からない。どうなっても知らない。そう、(ry

Q C FAQ 日本語訳の原文は?
A http://www.eskimo.com/~scs/C-faq/top.html

Q プログラミング言語C(通称 K&R)って時代遅れだと聞いたけど?
A どうだろうねぇ。出回っている第二版ならANSI C準拠だから使い物にならないってことはないけど、時代遅れかどうかは・・・
えーと、fileからデータの情報を受け取って動的にメモリを確保したいと思うのですが、
そのデータ数の種類は決まっていて、データ型は定義しているのですが
そのデータの一つに可変長(データ数が)のデータがあります。
いまだとデータ型の配列としてmallocして、その配列の要素全てに
更に可変長のデータ領域をmallocするなんてアホな設計しか思いつきません。

この場合、その可変長データだけ型から切り離して
可変長の最大 X データ型の数 で一括領域確保するべきなのですか?
データ型が9000個必要で、そのデータ型にあるポインタに9000回mallocなんてしたくないんです。
この考えって間違ってますか?
234:03/10/20 08:50
>>17

>まさか、ヘッダファイルに関数を直書きする気じゃあるまいな?
え?そのつもりでしたが・・・ダメなんですか?
> 9000回mallocなんてしたくない
なにがいやなのさ?
>>23
( ゚Д゚) ポカーン
>>22
もう少し具体的に書け
27デフォルトの名無しさん:03/10/20 09:09
>>22
ファイルサイズ調べといてそれでmallocすりゃええやん
それとも圧縮ファイルなのか?
>>27
文字だけでなく数値に変換したりとかがあるじゃねぇの?
>>23
2つのCソースにそのヘッダをinclude,そして,それらをリンクさせたら,
同名関数の多重定義であぼーん。
304:03/10/20 09:53
>>29
そうでした、
今それでエラーになりました
ヘッダファイルにexternを羅列することにしました

また質問で申し訳ないんですが
構造体の宣言って

struct hoge{
int day;
char name[20];
};

こういうのを直接ヘッダファイルに書くんでしょうか?
314:03/10/20 09:55
ん?またおなじことか?
でも、構造体ってextern 書き方がわかりません
struct hoge HOGE;とか書いてもエラーになります
どうすればいいのでしょう
staticにすればいいのよ(ダメじゃん)

構造体はそのままヘッダに書けばいい。
33デフォルトの名無しさん:03/10/20 11:55
文字列の初期付き出力について教えてください
H8S,H8/300 C/C++ コンパイラ V3.0A の環境で作業しております

//-------------------------------smp
char buf[1024];
double x = 57.535;

sprintf(buf, "%.16g", x);
//-------------------------------

変換文字列 buf : 57.534999999999997\0・・・
となりますが、57.535\0・・・を取得したいのです。
倍精度数が整数で表現できない値を含む場合に起こる問題だと思うのですが
よい対処方法はないでしょうか?
但し、有効桁数を超える値は、変換文字列を指数形式で取得したいのです

Microsoft Visual C++でsmpを試みたところ
変換文字列 buf : 57.535\0・・・
となりました。
また、sprintf(buf, "%.16f", x);
変換文字列 buf : 57.5349999999999970\0・・・
となりました。

(バージョンを上げる事で解決したりするんでしょうかね
または、そろぞれのコンパイラ仕様でなんでしょうか)

34デフォルトの名無しさん:03/10/20 12:01
%.3f
35デフォルトの名無しさん:03/10/20 12:13
33です うまく伝わらなかったようなので補足します。
smpのxの値は変動します。
有効桁数を16とし、それを超えるものは指数形式で表現したいのです
smpでは、指数形式の表現は出来きるのですが、
倍精度数が整数で表現できない値を含む場合に起こる問題が
発生してしまうと思われます。

よろしくお願いします。
>>33>>35
諦めてください。
double をつかわないといいと思います。
38たぶん:03/10/20 12:51
64bit浮動小数点は符号1bit+指数11+ 実数部52 で表現されますから
log10(2)*53 = 15.9545897701910033
つまり16桁の精度は無いという事ですよね?

有効桁数を16にしたいという事は
123.4567890123456
12.34567890123456
123456789012.3456
という意味ですか?
394:03/10/20 12:57
>>32
ありがとうございます

何で僕のやることがわかるのか不思議なんですが
じつはその構造体(の配列)をアプリケーションで共有したいんです(読み取り専用)
staticはまずいですか?
>>35>>33と違うことを書いてないか?
それは補足じゃねぇよ。電波か?
VCでx=57.5349999999999970;としたらどう出力されるのかな。
57.535になりそうだけど。
double は有効桁数16桁しかないから
12.34567890123456
57.53499999999999 65
で切られて丸められて 57.535 になるんじゃないの?

有効桁数以上の桁数を指定された時の動作は規定されてないのでは?
その前に H8 で double なんて遅くて使い物にならんと思うのだけどなあ
44デフォルトの名無しさん:03/10/20 13:54
>>38
整数優先で16桁
123456789012345.67890 → 123456789012345.6
>>44
ならば、先に桁数を求める必要がある。
指数部からおよその桁数を出しておいて、そこから前後±して桁数を求める関数を作り
それから %*.*f でやればいいでしょう
何がしたいのか良く分からない質問に対し、自分なりの解釈を行いながら
何とか解決してやろうという45に涙。
まさかと思うけど %f は?
>>39
グローバル変数の存在を忘れてるな…
49デフォルトの名無しさん:03/10/20 19:29
"fgets"とか"fprintf"とか"sscanf"とかって、スレッド・セーフな関数なんでつか(´・ω・)?
構造体に文字列が AA AB AC AA AA AB と6個入っていて、これを
AA 3
AB 2
AC 1
というようにその文字列の入っている個数を表示させ、大きい順に並べたいのですが
どうもうまく作れません。どうすればいいでしょうか?
ポインタの位置を
最初の場所に戻してくれるような関数ないですか?

いつもは、ポインタをずらすためのものと全く弄らないもの二つを
コピーして用意しておくんですが
こういう具合にポインタを2個以上コピーしておくやり方でもいいのでしょうか?
がんばってちょ
>>50
他の人に作ってもらうといいとおもいます。
>>51
そういうのがわずらわしいんで、

*d++ = *s++;

ではなく

d[i] = s[i]; i++;

と書くようにしている。
55デフォルトの名無しさん:03/10/20 22:26
>>54
五十歩百歩
56名無し:03/10/20 22:35
for( int i = 0 ; i < 10 ; i ++ )
{
//do something
}

これでint i = 0 のところでエラーがでるんですが
Cではムリなんですか?
学校のPCでやってるんでコンパイラはなんなのかわかりませんが
コマンドはccでコンパイルしてます
Cではムリです
C02準拠のコンパイラならOK
>>51
まさかと思うけど……rewind()ではないよね?
60デフォルトの名無しさん:03/10/21 00:29
構造体の先頭アドレスを引数にすることは良くない様なハナシを聞きました。
なにがイケナイのでしょうか?
アライメント、ポインタがキーワードみたいですが。。。
ちなみに構造体のアライメントについては理解しています。
ポインタとからむと不都合が生じるのでしょうか?
知ってる方教えてくださいな!
ここ見れ!とサイトを記載してもらっても結構です。
よろしくね!
>>60
氏ね
単発質問でスレ立てるような奴は氏んで良いよ。
63デフォルトの名無しさん:03/10/21 02:01
>>60
バイト境界を意識しながら
構造体にパディアン入れていけ。
そして遠慮なく使え。
6460:03/10/21 02:12
なるほど!よく分かりません。。。
>>64
 アフォは出力されたアセンブラのソース見て研究しろ。
 これだからJava厨は嫌なんだよ。
マルチポスト死ね
アホだな。というか、構造体のポインタ使っちゃいけないなんて
ちょー昔にちょこっとだけ見かけたことがあるくらいだが、いまだに
そんなの信じてやってるやつとかいるのかなぁ。

C++なら参照渡しがあるが、C時代では関数に構造体事態を引数に
渡すのが安全というのがあったが・・・。スタックフローのほうが怖いわ。
6860:03/10/21 02:38
つまり現代では(?)、構造体の先頭アドレスを引数にしても良い。
という事デスカ?
アホすぎ・・・
昔っからそうだよ>>68
てかあなたはサンプルとか(適当なOSの)APIやライブラリの説明とか読んだことありますか?
たとえば fprintf なんかでも普通に構造体のアドレスをパラメータにしてるでしょ?
7160:03/10/21 02:48
言われてみれば確かにその通りですねぇ。。。
いや、なんかで構造体のまま渡した方が間違いがないという記述を見たことがあるぞ。
サンプルコードレベルならどっちでもいいんだろうが・・・。
>>72
 つーかよほどの必要性がない限り構造体渡しなんて氏ねェよ。

 スタックオーバーフローするかもしれんし、コピーする分性能ロスがあるじゃねぇか。
 アセンブラコード比較すれば一目瞭然。こんなんでポインタ操作間違えるようなコンパイラは
 逝ってしまえ。

 C++なら参照渡し、Cならポインタ渡しだろ。
>>72
初学者にデタラメ教えるんじゃねーよ。
値を受け取る目的で参照渡しするやつはゴミ。
7673:03/10/21 03:16
>>75
 それは確かに総だ。
60のがせネタのソースはどこだよ。
http://pc2.2ch.net/test/read.cgi/tech/1066554403/
ここにもソース書いてないな
7960:03/10/21 03:25
ソースは人の会話です。
私が作成したCソースで構造体の先頭アドレスを引数にしているのを見たA氏曰く、
A氏「構造体の先頭アドレス渡してる!」
B氏「あちゃー!それやるとポインタで…(以下聞き取り不能でした)」
私はその会話をちょっと離れたところで聞いて、「???」となったという次第です。
>>79
 ローカル変数の構造体のポインタを渡してその関数内でリストに
 格納とかしてないければいいんだよ

 あとは問題なし。
(60 が「構造体のアドレス」ではなく、「構造体の先頭アドレス」と書いているのが
 微妙に気になるのは漏れだけ?)
82落ちを予想:03/10/21 03:46
じつは構造体の先頭ではなく後ろのアドレスを渡さなければいけない関数だった
実体のない構造体のポインタだけを宣言して、値を返してもらうための関数に
渡してんじゃない?
それだとすれば、A氏、B氏の言葉が説明つくだろ。
FILE* みたいに専用のアロケーション関数で得たポインタしか許可しない関数に、
FILE fp; fprintf(&fp...); みたいなことしてる、という可能性もあるか?
あとはプロセス境界を越える IPC とか、シリアライズが必要な場面とかで、
ポインタを使っているとか。
構造体そのものを返す関数といえばdivやldivくらいしか思い浮かばないし、渡す関数は何も思い浮かばないなぁ。
別プロセスやマルチスレッドでの制御なら、ポインタ渡しはまずそうだな。
>>74
やっていいとはいってないよ。15年くらい前にそういうこといってるアホが
いたっつー話。
88  :03/10/21 04:53
>>87
あとはRPCとかCORBAとか使うときか。
 でも、Cを多少使えたらメモリがどこにアロケートされるかくらいわかるだろ。
typedef struct _POINT {
 WORD x;
 WORD y;
} POINT;

程度のものなんかは値渡しする API が結構ある。Win32 でも MacOS でも。
ざっくり考え方を変えて、たとえば sscanf に何かの構造体のアドレスを
渡してた、なんてのはどうだろう。。。
91デフォルトの名無しさん:03/10/21 04:56
age
>>59
そうです、その機能が欲しかったのです
9392:03/10/21 06:15
てかそれ、今調べたらファイルポインタ用ですね・・・
A氏とB氏が見たソースを見せてもらえれば、何かわかるかもしれませんね。
95デフォルトの名無しさん:03/10/21 09:13
ちょっと質問。
今まで
int i=0,j=i;
みたいなコード結構書いてきたんですけど
これでjは必ず0がになってるんでしょうか?
>>95
心配ならそんな書き方するな。
if(a==(b-10)==(c-20)) // 処理
という判定をしてるのですが、
これって正しい方法ですか?
どうもうまくいかず困っております。
やりたいことは間違ってても見た感じでわかると思いますが、
aとbから10引いた数とcから20引いた数が全て同じ場合に処理をする、ということです。
まあそうなんですけどね。
今までのどうだったのかなって気になったもんだから。
>>97
>if(a==(b-10)==(c-20)) // 処理

if( a==(b-10) && a==(c-20) )
{
  // 処理
}

位でいいのでは?
100デフォルトの名無しさん:03/10/21 09:56
評価順序わからないけど
a == (b-10)が等しかったら1とか返すはずだから
1 == (c-10)を判定する。
if (a == (b-10) && a == (c-20))
>>97
if(10<x<30)
これと似たような間違いだな。
>>100
 この場合 == だし 評価的には&&だから評価順序は考えなくていいだろ。

 あと1じゃなくて TRUEだろ(内部的には1だとしても)そして a==(c-10)だ。
103デフォルトの名無しさん:03/10/21 10:27
>>102
C++に逝ってください。そして二度と戻ってこないでください。
104デフォルトの名無しさん:03/10/21 10:29
>>103
アフォがC++ なら true,false だ。意図的に大文字で書いたのもわからんのかね
105デフォルトの名無しさん:03/10/21 10:31
とにかく1
CにTRUEなんてない
>>105
_Bool型は C99で仕様書に規定されてるし、TRUE,FALSEはそうでなくてもいろんなヘッダで定義されてる。
 
 可読性を重視しないのなら好きにしろ。
> とにかく1
お前もキエロ
>>102
>そして a==(c-10)だ。

a==(c-20) だろ?
>>108
スマソそうだな。1==(c-20)じゃないことは確か。
110デフォルトの名無しさん:03/10/21 11:49
>>106
あれはtrueにfalse
いろんなヘッダで定義されていればCの仕様の一部になるのか。
112デフォルトの名無しさん:03/10/21 11:54
>>107
1を返すと規格で定められているんだからしかたないよ(笑)
11うるさいなぁ。

114デフォルトの名無しさん:03/10/21 12:00
#include <stdio.h>

int main(void) {
int a = 0, b = 10, c = 20;

for (; a < 3; a++, b++, c++)
if (a == (b-10) == (c-20))
printf("TRUE\n");
else
printf("FALSE\n");

return 0;
}
おれのbccでは
FALSE
TRUE
FALSE
>>106
誰も_Bool型の話なんかしていないぞ。
http://seclan.dll.jp/c99d/c99d02.htm#dt19991129
> 2.8 文字列定数とワイド文字列定数の結合
> プリプロセッサは、並んだ二つの文字列定数を一つの文字列定数に併合する役割を持っています。

プリプロセッサの仕事とは知らなかった・・・
>>93
ループ回すのにポインタ変数を使う意味,忘れてねェか?

インデックスで回す
for(int i=0;..;++i) array[i]=hogehoge;
だと,ループ毎に array+i のアドレスを求める演算コストが掛かる。

代りにポインタ変数で回す
for(char *p=array;...;++p) *p=hogehoge;
だと,そんな計算する必要がない。

インデックスの代わりなんだから,おとなしく使っとけ。
118デフォルトの名無しさん:03/10/21 15:57
教えてください
別の関数でmallocした領域の
サイズってどうやって調べればいいのでしょうか?

struct HOGE_KOUZOUTAI* hoge=get();//構造体が何個か入った領域の先頭アドレスを返す関数

//こうなってる場合
//SIZE←何個分の領域があるか

for(int i=0;i<SIZE;i++){
printf("%s \n",hoge->id);
hoge++;
}

みたいなことがやりたいのでSIZEが知りたいのですが
どうすればいいでしょう・・・

(hoge->id)!=NULL

でやっても、他の何かが(ゴミ)入ってるので区別つかないのです
119 :03/10/21 16:00
>>118
idってなんだよそもそも。

 mallocした時にサイズ調べとけばいいだろ。
>>118
無理。mallocはそれを知っているが(ゆえにreallocできる)、利用者は確実に知る方法はない。
だからわかるようにしておく。
このスレでfor(int i=0;と書いている奴がやけに多いが、C99からはOKになったのか?
>>119‐120
レスありがとうございます

「id」ていうのは構造体のメンバです、もちろん自分で定義した

この場合、別関数からの取得なので
グローバルな領域にそのサイズを入れとけって事ですか?

でも、これを利用するプログラムはマルチスレッドなので
グローバルな領域に持ってこれません(サイズ入れた値が変えられる恐れがある)
それを考えると、一つの大きな関数つくるしかないのですが・・・どうすればいいのでしょう

あとは、構造体にサイズを入れるような変数もたせるとか考えましたが
一回サイズがわかればいいので
全部の構造体にその領域があるのはなんか無駄のような気がします
こういう方法はCでは常套手段なのですか?
Cの流儀がまだよくわかりません
>>121
あっ、ごめん、俺、C++ スレへの書き込みの癖でこのスレでも for(int i って書いちゃってる。
でも、確か C99 ではその書き方 OK だった気がする。
>>122
サイズを戻り値にして、構造体へのポインタをアドレス渡しする。

size_t get(struct HOGE_KOUZOUTAI **);

struct HOGE_KOUZOUTAI *hoge;
size_t size;
size=get(&hoge);
ありあとうございます
すぐにやってみます
できました
感謝します
127117:03/10/21 18:32
>>121
例を挙げる程度なら,そっちのが分かりやすいだろ?

>>127
NO!
ここで聞くような初心者は、まるコピしてエラーに会う可能性有り。
むしろ宣言しないほうが良い。
どっかで int i;ってあるんだろうなって思わせたほうが良いのでは?
12954:03/10/21 19:39
>>117
>>93 はインデックスで回すのがどうとは言ってないよ。
初心者はC99対応の処理系を使うべきだな。
>>130
そして C++ に移行できなくなるわけだな。
132デフォルトの名無しさん:03/10/21 20:23
文字列を入力として受け付けて、その文字列中に含まれる数字の合 値を求めてみてください。
例: a1b23g4 と入力された場合、1+2+3+4 で10 を出力してみせてください。
できました
134デフォルトの名無しさん:03/10/21 20:42
>>133
できたらコードお願いします。
138117:03/10/21 21:16
>>129
そりゃそうだろ。俺が説明するために引っ張り出した例だし。
(配列,インデックス)
の組み合わせでアクセスするより
(先頭ポインタ,現在のポインタ)
(末尾ポインタ,現在のポインタ)
なんかの組み合わせでアクセスする方が効率的な場合があるってことをな。
13951,93:03/10/21 21:44
>>138
いやだからですね、
int *p;
が、あったとして

値を最後まで取り出すと(p++の繰り返しで)

pの位置は最後の部分になっている
例えばコレがmallocした奴だったら
先頭に戻さないといけない

そういうことにならないために、みなさんは
int *p,*p2;
p=p2=(int*)malloc(size_t);
と、あらかじめやっておいて
たとえば
for(int i=0;i<SIZE;i++){
//...
printf("%d",*p2);
p2++;
}
free(p);

とやっているのですか?と聞きたかったんです

あるいは
printf("%d",*(p+i));
とか
>117
x86だと、mov [esi+ecx*4]で一発で済む。
Better C って何ですか?
>>141
>Better C って何ですか?
マイクロソフトが作成したプロフェッショナル向けのコンパイラ。
一般人はあまりお目にかかれない。
>>139
そうだよ。
>>139
いやだからですね、
int x;
があったとして

おまいがxの値を適当に色々いじる

その後でxを元の値に戻してくれる便利関数があると思いますか?
rewind(&x)
#include <stdio.h>
main(void)
{
int a;
int b;
a='a';
printf("文字を入力してください\n");
scanf("%s",&a);
b = a-97; */aのアスキー値が97だから、97を引いてる/*
printf("%d\n",b);
}

文字を入力して、それをアスキーコードで表せたんですが、
(「a」を入力すると、0が出力されて、「b」を入力すると1が出力される。)
文字列の場合はどうしたらいいのか、イマイチわかりません。
つまり、キーボードで「abc」と入力したら、012、と出力したいんです。
どうやったらいいか、教えてください。
お願いします。
とりあえず、getchar() のループで考え直せ。
>>139
>free(p);
>
>とやっているのですか?と聞きたかったんです

free しませんが、何か?
int c;
while((c=getchar())!=EOF){
 if(islower(c)) printf("%d ",c-'a');
}
>>139

p = malloc( size );
fnc( p, size );
free( p );

として、別関数で処理すると言う手もあるぞ。

# 結局の所は、元のポインタを保存しておくことに等しいわけだが。
# と言うか、元の状態を保存せずに元に戻すなんて出来るわけがないだろ?
# そんなこともわからんか?と(ry
15151,93:03/10/22 01:09
>>150
># と言うか、元の状態を保存せずに元に戻すなんて出来るわけがないだろ?

いやだからそれを含めて聞いたわけです
「そういう関数(用意されて)ないですか?」ってね
いままで他言語(Python7年)やってて
初めてC言語やるので、いろいろやり方が違うので戸惑っています

例えば、ある関数内のテンポラリポインタは返せないので
(void*)get((void*)dest)
と言う具合に、いわゆる入れ物みたいな物を渡さないといけない
この入れ物渡すっていうやり方がどうも最初の頃思いつかず
全てを同じ関数内(main)に書いてました、あるいは広域変数とか使って・・・
152デフォルトの名無しさん:03/10/22 01:24
ぶっちゃけ、ヒープ領域に確保した先頭アドレスは常に保持しておくのは定石じゃろ。

確保したデータ内の特定の数値にアクセスしたいなら
配列を使ってアクセスするか
参照用のポインタにアドレスをコピーして、ポインタを使ってアクセスするもんだろ。
153デフォルトの名無しさん:03/10/22 01:34
c言語から、カレントディレクトリの移動とかって、
どうするんですか?
>>153
環境依存だ。
でも、まぁ、だいたい想像どおりの名前の関数が用意されているはず。
ええ〜?
GCかけて放置する手もあるが。
ぶっちゃけpython7年なんて人はじめて見た。
>>156
邪道!
邪道の邪はjavaのja。
よこしまな道
161デフォルトの名無しさん:03/10/22 02:03
>>156
非道!
162 :03/10/22 02:05
非道の非は、C#の#
163デフォルトの名無しさん:03/10/22 02:09
C++なんかには負けないもん
>>156
外道!
165デフォルトの名無しさん:03/10/22 02:29
外道はDelphi
C++ならヨソで聞け(言え)

変数なんぞ{の直後じゃなきゃ宣言できんのじゃ!
C99なんぞが出来る前の開発環境を使わねばならんのじゃ!
167デフォルトの名無しさん:03/10/22 02:39
>>166

int global; ←ここでもできる
int main()
{
C++の機能説明をCスレで行うとそれはウソになるね。
C++ならexternを関数内で宣言したり、いろいろできるな。

しかし時代遅れだなんだと言われても、需要があるんだからしかたあるまい。
どうせたいした力量もないくせに、コボラーがどうのとか一生懸命書き込んでるんだろう。

>>167
「ローカル変数」に置き換えてくれ(笑) グローバルはほとんど使わないから
変数といえばローカルになってたよ。
なんかみんなグローバル変数を邪悪な物としているけどサー
変数への代入だけは特定の関数に限定するとか、staticな変数にして
書き込み専用のファイルを作るとかそれなりのルールを作って使えば
良いと思うんだけどねー。
状態遷移を実装する場合なんかはその状態を保持する大域変数が
無いと都合が悪い場合が多いよ。
171デフォルトの名無しさん:03/10/22 07:13
>>156
禿しくスレ違い
CにGCなんぞあるかアホ

>>169
>C++ならexternを関数内で宣言したり、いろいろできるな。
んなもんBでもできるぞ
ちょっとスペル違うけど

>>170
同意
アプリケーションインスタンスも1つのオブジェクトで
状態を持つことは十分にありうる
>>171
Bohem GC
>>170
突っ込まれて後から言い訳してるアフォを基準に
邪悪なものとしている、なんて決め付けないでくれよ…。
>>173
実際にそういう風潮はあるだろ。俺は同意できないけど。
>>170の言うとおり
CにしろC++にしろ

イベントを受け取る関数内で
どうしようもなくグローバル使わなきゃいけない時がある
これはどうにかすべき
>>151
>いままで他言語(Python7年)やってて

どんな言語でも、何らかの状態を戻すためにはその状態を保存しておくだろ?
おまいはホントにプログラム経験があるのか?と(ry
17751,93:03/10/22 09:07
>>152

>ぶっちゃけ、ヒープ領域に確保した先頭アドレスは常に保持しておくのは定石じゃろ。

なので、そういう『定石』みたいな物を知りたかったと言う事もあって質問しました
自分で独学していて「果たしてこんなやり方でいいのか?」と疑問に思ったのです
しかもC言語って非常に低い階層のレベルでプログラミングするので
関数とかが非常に込み入ったものになります
ループも何個も入れ子になったりして・・・
ホントにこれでいいのか?と悩むわけです
(私自身Pythonのインデントの方でそういうのは慣れてますが・・・)
処理のロジック自体も、さまざまな(大げさに言えば)アルゴリズムがあって
「なにしてんだ?こんなことやらずに素直にやればいいのに」と思われるようなトリック的な方法とかも有ります
今まで私がやってきた言語の多くは効率よりも再利用性(ある意味わかりやすく書くことでもある)を最大限に引き出す形でしたし
また、そういった細かいことをやるのはあまりいい目で見られませんでした


>>157
ええ、多分私ぐらいですよねそんなの
しかも、Cを知らないなんて非常に稀かも・・・(もちろん全く知らなかったわけではありませんが)
私は海外組で、Pythonの需要は結構ありました
でもまあPythonって結構皆さんの知らないところでの活躍が多いかと思います
たとえばPythonで、あるOSのインストーラとかにも関わったことあります
アメリカでの話ですが一時期、学生にはJavaよりもPythonの方が人気がありました
>>177
>関数とかが非常に込み入ったものになります
>ループも何個も入れ子になったりして・・・

それは藻前の設計がタコだからだろ?
「ポインタを進める」という表現から巻き戻せると思ったのかもしれないけど、やっていることは上書きだ。
元の値かいくつ進めたかという情報をどこかに保存しておかないと元には戻せない。
180179:03/10/22 09:16
>>51へのレス
sizeofを使うとそれっぽいことはできるんだが
どうやって?
>>181
どうやって?
forで
*p++ = *q++;
していくわけだろ

その後、qを戻したいだけなら
q = q - sizeof(q);
すればいいんでは無いかと
>>184
qがchar *として、sizeof(char *)が4だとしたら、4つ戻すということになるけど。一体なんの意味が?
熱があるようだな、うわ言を言っている。
18751,93:03/10/22 10:01
>>184
何してんすか?
>>184

おまえもPythonやってたのか?
すまん、なんかくるっとった
本日の名言

入選:その後、qを戻したいだけなら q = q - sizeof(q); すればいいんでは無いかと

佳作:sizeof(char *)が4だとしたら、4つ戻すということになるけど。
191185:03/10/22 10:16
>>190
なんかおかしい?
まぁ要するに
こういう風にしたかったわけだが、普通に確保しといた方が楽だ

int ex1[256] = { 123, 345 };
int ex2[256];
int *p, *q;

p= ex1; q= ex2;
for( int i = 0; i < 256; i++ ){
*q++ = *p++;
}

p = p - ( sizeof(ex1)/sizeof(p) );

printf( "%d\n", *p );
printf( "%d\n", *( p+1 ) );
>>177
ランダムアクセスするんなら
配列でつかってアクセスだわな。

ループが入れ子って

for(h=0 ; h<YMAX ; h++)
{
  for(i=0 ; i<XMAX ; i++)
194193:03/10/22 10:33
すまん、途中でおくってしまった。
195192:03/10/22 10:36
つうか、普通にex1入れりゃいいじゃん・・・
もうだめぽ
>>192
sizeof(q)じゃintではなくint *の大きさを返すが、いいんだろうか・・・・
pのsizeによってはアライアメントの問題でだめぽの予感

ここはおもしろいC言語ですね…
>176
GCは状態を戻せるけど、状態は保存されてたっけか?
GCでなんの状態が戻ってるんだ?
詳細キボンヌ。
メモリが確保されている状態->解放されている/確保されていない状態
戻ってないやん。
初歩的な質問で申し訳ないです。

*.a ---→ 実行ファイル生成時にリンクされる
lib*.so.* ---→ アプリケーション実行時、若しくはdlopenによって必要な時にリンク(?)される

って見解なんですが、lib*.la って何に使われるんでしょうか?
204デフォルトの名無しさん:03/10/22 22:17
>>191-197
もういい。たくさんだ。
そろそろマジレスしろ。
205デフォルトの名無しさん:03/10/22 23:57
実は意外とマジレスだったりして(w
上のやりとり、ちょっとなごんだよ。
微笑ましくていい。
207169:03/10/23 00:27
やれやれ、アホ扱いか。 普通変数といえばC言語ではグローバル変数を
示すことがほとんどだとは知らなかったよ。

>>207
変数と言えばローカル・グローバルのどちらもあり得る
みんな、もうそろそろグローバル変数なんて捨てようよ。
210デフォルトの名無しさん:03/10/23 01:06
>>209
 GNU系のソースからなくなったら考えるよ。

211デフォルトの名無しさん:03/10/23 01:09
>>204
マジレスすると・・・・・

なんだっけ?

はい!次の質問どうぞ。
もうそろそろグローバル関数なんて捨てようよ
グローバルな視野を持て。
    -クラーク先生-
>>204
マジレスお願いします!
もうそろそろC++に移行しようよ
>>215
 道具は使いよう。つーかCがなきゃG++もメイクできないじゃん。

>>215
煽り屋?
アホか。C++もつかっとるわい。
なんでわざわざC++ごときに移行せにゃならんのか。
perlスクリプトの中で、c言語で書かれたプログラムを実行し、
その返値をスクリプト内で利用したいのですが、ちょっと分からないことが
あるので教えてください。
外部に返値を渡すと言うことで、返値はmainの返値ということになりますよね。
で、返値がintじゃなくて、
char *output[MAX] = {"aaa", "bbb", "ccc"}
という文字列型のポインタを格納する配列を返したいのですが…。
mainの返値の型がintじゃないって怒られますよね。
こういう場合ってどうすればいいんでしょうか…。
>>220
C で書かれたプログラム内の配列は、
プログラムが終了すれば解放されるので、
main()の戻り値で返す事自体が不可能。
>>221
てことはその配列へのポインタもダメって事でしょうか…。
なんか良い方法は無いですかね?
外部に一時ファイルを作って、そこに"aaa", "bbb", "ccc"を記述して
perlスクリプトの方でそれを読み出すか、
strcatで結合して、char hoge[] = "aaa\nbbb\nccc\n"
として、これを返値として、スクリプトの方でバラすぐらいしか思いつきません…。
>>223
後者は不可能
>>222
ポインタ値そのものを返す事は出来るが、
Perl 上では利用出来ない。

# C プログラム内の配列は C プログラムの終了と共に解放される上、
# Perl プログラムと C プログラムとではプロセスが違うから、
# そのポインタ値ではアクセス出来ない。
226デフォルトの名無しさん:03/10/23 15:59
>>220
標準出力に書き出して、Perlから読みとるのがいいと思う。
>>226
対話型のスクリプトなんで、標準出力に出すとまずいんですよね…。
となるとやっぱ一時ファイルの方向でしょうか。
228デフォルトの名無しさん:03/10/23 16:08
>>227
標準出力に書き出すのはCで書いた方だよ?
Perlの方ではパイプを使って読み出す。
対話型でもなんの問題もないけど。
>>228
あ、なるほど!
ちょっくら書いてきます。
230デフォルトの名無しさん:03/10/23 17:29
FF作りてえ
浮動小数点と固定小数点の違いってなんですか?
浮動する小数点と、固定された小数点。
233デフォルトの名無しさん:03/10/23 19:00
今ゲームを作ってるんですけどX座標とY座標の位置を決める関数を
作っているんですけど、戻り値は1つしか返せないから、2つの関数を
用意しないといけないじゃないですか。
でも全部のキャラで毎回2つ関数を呼び出すのは面倒なので
1つの関数から一気に2つの値を返してもらう方法ってありますか。
234233:03/10/23 19:01
後から見ると、かなり文章が変ですね。すみません。
235ヽ(´ー`)ノ:03/10/23 19:05
構造体にして、アドレス返せば?
236233:03/10/23 19:08
ポインタを使うのですか。
man perlxs
>>233
引数に X 座標、Y 座標を格納する変数へのポインタをそれぞれ渡し間接代入。
void ichiwokimeru(struct xzayoutoyzahyo *p)
{
 p->xzahyou = 100; p->yzahyou = 200;
}
struct xzahyoutoyzahyo ichiwokimeru(void)
{
  return (struct xzahyoutoyzahyo){.xzahyou=100, .yzahyou=200};
}
>>240
コンパウンドリテラルとかいうやつか?
#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netdb.h>
int main(int argc,char *argv){ struct hostent *host; struct in_addr addr;
char host_name[255]; printf("Host > ");
fgets(host_name,sizeof(host_name),stdin);
host=gethostbyname(host_name); if(host==NULL){
printf("%s is none\n",host_name); } printf("IP=%s\n",inet_ntoa(addr));
}
上のプログラムが実行時にコアダンプするのは何故?
243デフォルトの名無しさん:03/10/23 20:48
addrが未定義
>>242
printf("%s is none\n",host_name); printf("IP=%s\n",inet_ntoa(addr));}
>>244
プッ
246デフォルトの名無しさん:03/10/23 21:00
>>242
コアダンプだあ? 氏ね、ホラ吹き野郎!
247242:03/10/23 21:05
>>243
structだけじゃ定義したことにはならない?

代入しなきゃだめでしょ。
249242:03/10/23 21:35
コンパイル時にif文の前辺りに
"return makes pointer from integer without a cast"
という警告があったけど、
どう修正したらいいんだろう
>>249

キャストする(ただし型がそれで正しければね)
251242:03/10/23 21:51
どこを型変換すればいい?
gethostbynameの返り値の型はなんだ?
253250:03/10/23 22:03
>>252
BSD4.3の規格なら struct hostent* のはず。
254242:03/10/23 22:04
char型
もうソース全部捨てて糞して寝てろ。
>>254
 なんか変だな環境は何?

BSDやGlibcだと多分こんな感じ。

struct hostent *gethostbyname(const char *name);

257242:03/10/23 22:20
>>256のようにやったらhostがundeclaredした
>>257
?君はちゃんと宣言してると思ったが・・・。
 
>> struct hostent *host;

 なんでundecleard??



>>242
死ね糞マルチ
260242:03/10/23 22:53
>>259
すまん
261貧乏紙:03/10/23 23:00
いつの間にか「俺」から「私」になってる。。。
最初は「オレ」だった
263nat:03/10/24 02:13
Cプログラムからシステムコールで
MozillaにURIを読み込ませたいのですが(起動でなく更新)、
ググってもなかなか見つかりません。
環境はVineLinuxです。
>>263
>1を見た?その内容が理解できた?
fork() で -1(エラー)が帰ってくる理由は?
>>265
EAGAIN
親プロセスのページ・テーブルのコピーと 子プロセスのタスク構造に生成に必要なメモリを fork が割り当てることができなかった。

ENOMEM
メモリが足りないために、 fork は必要なカーネル構造体を割り当てることができなかった。
267デフォルトの名無しさん:03/10/24 03:09
>>264の言っている意味がわからんのだが
>>266
EAGAIN と ENOMEM 2つ原因が考えられるということですね。
>>268
人の書き込みを鵜呑みじゃなく、使ってる環境でmanしろということだ。
>>267
> 上記を逸した場合の結果は激しく未定義だYO!

多分これだろ。
271270:03/10/24 05:04
なにを言っているんだ。
> 標準Cではできない事の質問は
だろ
以下のプログラムを実行したところ、エラーが出ます。
FILE *fpa,*fpb;
int line;
char afname[30],bfname[30],buf[128];
fprintf(stderr,"複写ファイル名aを入力.\n");
gets(afname);
fprintf("afname=%s\n",afname);
gets(bfname);
printf("afname=%s\n",afname);
printf("bfname=%s\n",bfname);
if(fpa=fopen(afname,"r")){
printf("ファイル;%sがオープンできません\n",afname);
return;
}
if(fpb=fopen(bfname,"w")){
printf("ファイル;%sがオープンできません\n",afname);
return;
}

…続く
273272:03/10/24 08:07
以下のエラーが出てしまいます。
「プロジェクト project2_302.exeがEAccessViolationクラスの生成をしました。'アドレス 32566645でアド
レス F85D8A60に対する読みこみ違反が起きました。'プロセスは停止しています。再開するにはステップ実行
または実行を選択してください。」

他スレで聞いたところ、
開けた時にエラー処理、開けなかった時に処理続行になってますよ。
それと、"r"で開く時は既にファイルが存在していないとファイルオープン失敗ます。

無効なファイルポインタ使ってアクセスしてエラー起こしてる悪寒

と、いうレスを頂いたのですが、もうちょっと詳しくアドバイス願えないでしょうか。
>>272
if(fpa=fopen(afname,"r")){
printf("ファイル;%sがオープンできません\n",afname);

オープンできた場合にこう表示されるがいいのか?
275272:03/10/24 08:49
では、複写元ファイルを開く構文で、
if(fpa=fopen(afname,"r")){
      
の、後はどのように書けばいいのでしょうか?
>>275
少しは考えろよ。if(!(fpa=fopen(afname,"r"))){にすればいいだろ。
>>272
初心者の内は

fpa=fopen(afname,"r");

if( fpa==NULL )
{
  /* エラー処理 */
}

と言う具合に書いた方がいいと思うぞ?
278デフォルトの名無しさん:03/10/24 10:24
質問お願いします。Hoge型のポインタを6つ進めたいのですが
6回++する以外に、安全で手っ取り早い方法はあるのでしょうか。
「安全で」ってのがむつかしいね。
280デフォルトの名無しさん:03/10/24 10:30
質問お願いします
8bitのバイナリデータが2つある時
その差分をとって。
新しいビットマップファイルを一つ作成する方法を
Cを使って教えて下さい。

>>278
 配列の場合安全でなければ
 安全にしたきゃ現在位置から残りをもとめろ。
  hoge +=6


 リストの場合はそういう関数作れ。
282278:03/10/24 10:45
お二人ともレスありがとうございます。

>>279
そうなんですか。では今のままの方が良さそうですね。

>>281
配列の場合なのですが、うーん、すいません
ちょっとどういう事なのかが良く…単に+=6では駄目ですよねぇ。
>281が何を言いたいのかは正直オレもわからんw
配列からはみ出た場合を考える
285デフォルトの名無しさん:03/10/24 11:02
>>282
え? +=6じゃダメ?
>>284
ありがとうございます。>>281の内容も理解できました。
>>286
すまぬこっちも仕事やってるから、いいかげんな投稿だった・・・。
今日は煽るだけの厨房はいないの?
>>288 お前が居る、ガンバレ
290デフォルトの名無しさん:03/10/24 13:32
暗黙の型変換についての質問です。

以下のようなコードで enum 型を(オプション指定によって)コンパイラが
char のサイズの変数として扱った場合、これらの enum 型の変数は
(Cの規格上では)暗黙の型変換(char->int 型への変換)の対象とは
なっていないのでしょうか?

#include <stdio.h>

typedef enum { E0, E1, } E;

int main( void )
{
    E a = E1;

    printf( "%d\n", a );
    return 0;
}
>>290
なってるはず。アセンブラで出力して符号拡張してるかどうか
 みればわかる。

GCCならRTLでext系の中間命令がprintfで出力されるはず。

 
292290:03/10/24 13:47
>>291
と私も今まで思っていたのですが、先ほど
Borland C++ Builder 6.0
でコンパイルしたら、見事に型変換されていませんでした。
これはもともと規格上未定義なのか、コンパイラのバグなのか
知りたかったので・・・
>>292
 どんな感じになるの?
 つーか今の環境はC++ Builder入ってないです
Delphiならあるけど
294290:03/10/24 14:07
>>292
こんな感じです。

E a = E1;
  mov byte ptr [ebp-0x01],0x01
printf( "%d\n", a );
  mov al,[ebp-0x01]
  push eax
  push 0x004020a4
  call CC3260._printf
>>294

typedef enum { E0, E1=-1, } E;

でどうなります? gccではenumはcharにできないからなぁ・・・
規格上はintサイズだろうし
296デフォルトの名無しさん:03/10/24 14:16
してんじゃん
>>290
可変個の引数をとる関数(ここではprintf)に引数を渡す場合は、intより小さな整数型はintに格上げされる。
298294:03/10/24 14:25
>>295
ああわかった、それでいいんだわ。
どうして290のような疑問がうまれるのか興味ある。
300294:03/10/24 14:29

> mov al,[ebp-0x01]

ここでしてると思われ。al(8bit) → (32bit)

>>300
自分で自分に回答?
302デフォルトの名無しさん:03/10/24 14:33
>>295
ちょっとやってみます。

>>296
mov al,[ebp-0x01]
で a の値を al に代入していますが、その後すぐに
push eax
では EAX の上位のデータはどうなっているか分かりません。
(不明なデータがスタックに積まれている)

>>297
本当?

こんな下らんレスに偽者が出るとは。>>298
294のコードって、Partial Register Stall食らわない?
それとも、省略されているところでなんとかなってたりするの?
304301:03/10/24 14:35
偽者か(^_^;) そういえばあれだけsageとるな。

>>302
本当 ちなみにfloatはdoubleに格上げされる(printfでfloatもdoubleも%fなのはそのため)
305290:03/10/24 14:37
>>299
以前に別のコンパイラを使用して作成していたコードを
今回 Borland C ++ 6.0 を使用して再コンパイルした所、
printf() で奇妙な値が出力されたので、原因を調べていたら
たまたまこんなことを発見したのです。
>>305
Borlandか・・・やってみたいけど持っていないから無理だな。
307301:03/10/24 14:42
もしかしてenumは整数型とみなされていないのか・・・・?
308290:03/10/24 14:43
>>295
やってみましたがアセンブラの出力は変わりませんでした。
>>305
そのときもコンパイルオプションでcharと同じ大きさにするようにしていたの?
ALより上のEAXのビットによって出力される値が変わるってこと?
311294:03/10/24 14:51
>>308
 すまぬGCCの出力と比べてるけどそもそもMASMの文法はよくわからんので。
 それで実行するともちろんデタラメだったら
>>302が正しいかも。

>>310
 >>300が違ってるとそうなるのかなぁ。  
EAXは返り値として使ってるはずだから
printfの前に上位ビットを埋めるたのを返す関数を書いてみたら?
>>311
名前欄直せよ・・・
314290:03/10/24 14:55
>>309
以前はどうだったか忘れました(汗

>>310
です。
>>300 は間違い。>>302 がただしい。
相手コンピュータなんだから「かも」とか、そういう問題ではない。

>>308
実際に動作させた結果も変なの?もともと EAX の上位24bit はゼロで、
それを利用してのそういうコードが出ている、というわけじゃあなくて?
手元のbcc 5.6.4だとちゃんとしたコードを吐くな。
まず、aに代入する以前にeaxにE1を代入して、それから[esp]にalを入れてる。
そして、そのままeaxをprintfに渡してる。
eaxに代入してるのは符号拡張した値ね。
>>317
バージョン違い?
319デフォルトの名無しさん:03/10/24 15:05
その疑わしきプログラムをうpしる! もちろんコンパイルしたものを。
320デフォルトの名無しさん:03/10/24 15:06
偽者がウィルスでもアップしたらまずいか。。。
321デフォルトの名無しさん:03/10/24 15:18
結論はバグということでいいのか?
322290:03/10/24 15:26
>>315
>実際に動作させた結果も変なの?もともと EAX の上位24bit はゼロで、
>それを利用してのそういうコードが出ている、というわけじゃあなくて?
です。

>>319
それは勘弁(w
でも、もっと簡単なコードで現象が確認できました。
enum 1個だと問題が表面に出てこなかったのですが、
enum を2個使用したプログラムの実行結果は以下の通りです。

#include <stdio.h>

typedef enum { E0, E1, E2, } E;

int main( void )
  {
  E a = E1, b = E2;

  printf( "%d %d\n", a, b );
  return 0;
  }

出力)
9382401 2
323316:03/10/24 15:30
お、確かに2つ使ったらおかしくなった。
普段使わないオプションだから気づかなかったけど、バグだね。

(BCB6+UPDATE4)
ゴミ?>9382401
>>324
 最後の01だけゴミじゃない。
とりあえずバグなんだな。intにするべきなのにしていないと。
327デフォルトの名無しさん:03/10/24 22:57
手帳ほどの大きさでC言語ができる端末ってありますか?
wanderswan
>>327 シャープのリナックス搭載したザウルス。
がめぼy あdヴぁんせ
327じゃないけどさ
>>328
>>330
どっちもそれ自体でプログラミングできるわけじゃないだろ。
あくまでもターゲットとして開発できる方法が一般人にまで手が届いてるだけで。


ちなみに私はワンダーウィッチ持ってますが何か?
GBAのブートケーブルも持ってますが何か?
そして両方とも使ってませんが何か?
332デフォルトの名無しさん:03/10/25 02:22
質問させてください。
getch()を使って数値を取り込んで計算させるものを作ってりるのですが、
getch()の戻り値は整数型とあったのでint型に取り込んだ数値を入れて、
例えば
int a,b,c;
a=getch();
b=getch();
c = a+b;
printf("%d",c);

のような感じでやると、108とか訳の分からない結果になってしまいます。
%dではなく%cだと、getchで取り込んだ数はまともに表示されるので
どうやらchar型らしいというところまでは分かったのですが、
いざ計算させる際にchar型をintに変換させる方法をatoiしか
知らないため、困っています。getcharではなくgecthでないと困るのですが、
どなたか、ご教授をお願いします。。
くだらない質問ですいません。
>>331
ザウルスならCF一杯積めばそれ自身にgcc入れて開発できるよ。

>>332
a=getch()-'0';
b=getch()-'0';
335デフォルトの名無しさん:03/10/25 02:42
atoiかませばいいじゃん
336332:03/10/25 02:47
>>334
ありがとうございました。できました。
ちなみに、-'0'はどーゆー意味があるのでしょうか??

>>335
いや、かませるならそうしたかったのですが、できなかったので。。
>>336
アスキーコード見ればわかる
338332:03/10/25 02:53
>>337
ありがとうございました。
>>327
ポケコンでCを使えるのがあったような・・・
340330:03/10/25 09:16
>>331
書き込んだあとに気づいたよ。
wanderswanって書いてあったからGBA書きたくなって。

漏れもブートケーブル持ってるが自作プログラムは転送したこと無い。
でもガンガってる。つもり。

devkitadv + GBAエミュ はフリーなGUIプログラム製作環境です。
とか言ってみるテスト。
wonder
342272:03/10/25 13:03
遅レスですが、みなさんのおかげで先に進みました。感謝。
343デフォルトの名無しさん:03/10/26 00:25
windowsMEでコマンドプロンプトを使ってコンパイルしたいのですが、
どんな環境でどんなコンパイラを使っていいか全く分かりません。
教えてください。なるべく専門用語は使わないで下さい、初心者なもので
>>343
まず言っておくが、あんたが初心者でCを勉強したいと思ってるなら
専門用語をぐぐるなり辞書なり引いて意味を調べることが大切だと思うぞ。

で本題だが、環境っていうのはOSとかコンパイラのことを指すわけだ。
だから「どんな環境」ってのは的外れ。
コンパイラは何でもいいと思うけど、どうせならcygwin(gcc)がお勧め。unixの勉強もできるし。
それがむずかったらborland c++ compilerがいいと思われ。
インスコの仕方くらいはぐぐれよ。
>>343
Borland C++ Compiler(フリー)
を使うとか。検索しなさい。
俺はMEで使っている

後は、Visual C++6.0を買うとか。

コマンドプロンプトを使うなら、Borland C++ Compilerでいい。
検索しなさい
346デフォルトの名無しさん:03/10/26 00:48
>>344,345
有難うございます。早速やって見ます。
347デフォルトの名無しさん:03/10/26 01:10

prtintf("Hellow World! \n");

348343:03/10/26 01:17
ダウンロードしてきた setbcc03.lzh を解凍して
setbcc.exe をダブルクリックしますってどこにあるのかわからない…
349デフォルトの名無しさん:03/10/26 01:21
あるテキストを改行ごとに分けて一括して関数間で受け渡ししたいのですがどう
すればよいでしょうか?
350デフォルトの名無しさん:03/10/26 01:26
>>349を補足しますと2chのdatフォーマットの読み出しをしようとしてます。
自分的には構造体にchar変数を定義して構造体のインスタンスを
配列で宣言して受け渡すのはどうかと考えてみました。
これは適切でしょうか?
351デフォルトの名無しさん:03/10/26 01:32
>>349
たとえば、

typedef struct
{
char **textline;
int nlines;
}AAA;

な構造体を作って
textlineに各行のテキストを格納し
nlinesにとりあえずトータル行数を格納

これを関数に渡していくとか。

void Func(struct AAA *aaa)
{
省略
}

352デフォルトの名無しさん:03/10/26 02:06
>>351
さっそくやってみます。
ありがとうございます。
非常に基礎的なことだとは思うのですが、参考になるものが見当たらず困ってます。

やりたいことは別フォルダのファイルの参照です。
同フォルダならば単純に
fp = fopen(fname, "r");
でいいですよね?

例えばソースファイルが C:\hoge にあってそれを実行してるとして、
参照したいファイルが C:\new\ とか、D:\hage といったフォルダに
ある場合、どう指定したらよいでしょう?
この時、ファイル名はオープン時に直接指定するのではなく、
fname に格納されているものを扱いたいです。
char buf[_MAX_PATH];
sprintf(buf,"%s%s","D:\\hage\\",fname);
fp = fopen(buf,"r");
355353:03/10/26 06:04
>>354
thanx my brother.
>>354
sprintf(buf,"D:\\hage\\%s",fname);じゃダメなの?
357デフォルトの名無しさん:03/10/26 13:25
禿げって言うな!
358デフォルトの名無しさん:03/10/26 13:33
若禿はツラいんだろうな
359354:03/10/26 14:31
>356
表現が中途半端でしたね

const char *dir = "D:\\hage\\";

sprintf(buf,"%s%s"dir,,fname);

ようするにディレクトリも別の箇所で自由に指定可能、と
360 :03/10/26 19:37
質問です。
sendto()とsendmsg()の違いが分かりません。相異点として
前者が単一バッファで、後者がスキャッタ/ギャザーらしいことは
調べました。しかし、意味も使い分けも分かりません。
やりたいことは、UDPデータグラムを送ることなのですが、
どういうときにどちらを使えばいいのですか?
>>358
正直そのうち自殺するつもり。
363デフォルトの名無しさん:03/10/26 21:37
>>362
とりあえず死んだ気になって全剃りしてみたら?
ボーランドとビジュアルC
ってどっちが、とっつき安いの?
>>364
Delphi使え。
>>364
ひまわりを薦める。
367デフォルトの名無しさん:03/10/27 00:01
超初心者ですがgccでなんとかなってますよ
368デフォルトの名無しさん:03/10/27 00:34
後々は統合開発環境を使うとしても、
ちゃんとしたカリキュラムなら先に make を使わせるだろな。
>>364
C#
質問でつ

コマンドhogeを作っているんですが・・
% hoge | moge

$ hoge > moge

% hoge
の判別をしたいのですが、なにかAPIとかあるんでしょうか?
ちなみに環境はCYGWINです。
>>370
なにが目的で判別したいのかわかんないけど、とりあえず fstat
>>370
なにが目的で判別したいのかわかんないけど、とりあえず スレ違い
373dana:03/10/27 20:23
ファイル読み込みに関する質問です。

1,2,3
4,5,6
7,8,9


こんな感じのテキストをfscanfを使ってそれぞれの数値を読み込みたいのですが、カンマが邪魔で
ちゃんと読み込めません。どうしたらいいですか、教えてください。
374デフォルトの名無しさん:03/10/27 20:27
JavaやC++の初心者本などでよく
「C言語とは違って、配列のサイズを取得できるので安全であり・・・」
などといった記述をみかけるのですが、C言語でも sizeof演算子で
配列のサイズを取得できるのではないのですか?
>>373
"%d,%d,%d"

>>374
真に配列ならな
>>373
"%d ,%d ,%d%d ,%d ,%d%d ,%d ,%d"
>>374

void *func()
{
return malloc( rand() % 99 + 1 );
}

この関数が返す配列のサイズを取得してみよ
>>377
それは配列ではないし、仮に配列だったとしても void にサイズはない。
379デフォルトの名無しさん:03/10/27 21:29
質問させてください。
findfirstfile で検索するファイル名を、
「*.txt」 のように指定すると、
「abc.txtx」のようなファイル名まで
拾ってきてしまうのですが、これは、
こういう仕様なのでしょうか?
>>379
C言語にそんな仕様はないが、ヒントはショートファイル名。
>379
Win32API質問箱 Build14
http://pc2.2ch.net/test/read.cgi/tech/1065328397/

>374
void func(int a[10])
{
int s = sizeof(a);
}
さてsの値は?
128
383374:03/10/27 23:24
>>381 sの値は sizeof(int*)と同じ。でしょうか。

というか、なぜ sizeof で配列のサイズが取得できることがあるんでしょうか?
配列が宣言された後では、つまり式の中では、配列変数名は単に
その領域へのポインタでしかないんですよね。なぜ取得できるの?
もしかしてコンパイルした時点で解釈できる場合だけ、とか?

384デフォルトの名無しさん:03/10/27 23:31
16進の数値を10進に変換できなくて困っています。

<データファイルの形式>
位置 桁数 内容
1   4 アルファベット4桁
5   3  16進形式の数値
8   1  16進形式の数値

<データファイルの内容>
58 58 58 58 00 19 74 05.......

<ソースコード>
typedef struct {
charID[4];
charLength[3];
charEtc;
} HEADER;

HEADER buf;
385384:03/10/27 23:31
つづきです。

fread(&buf, 1, sizeof(buf), fp);
printf("ID=%s\n",buf.ID);
printf("Length=%d\n",buf.Length);
printf("Etc=%d\n\n",buf.Etc);

<実行結果>
ID=XXXX
Length=1245052
Etc=5

「1245052」はbufの先頭アドレスを表示しているのが分かったのですが、
「001974」をどうやって「6516」に変換したらいいのかわかりません。
どなたか教えてくださいませんか。本当に困ってます。
>383
えっと、>>1のリンク先を読んだことはありますか?
なんか偶然XXXXが表示されてるだけってのにも気がつかないし
エンディアンも示してないし
charが整数型だってのも知らないみたいだし
>>383
[sizeof演算子]
オブジェクトの大きさ、定数・型名が示す型の大きさをバイト単位で計算する。
注:オペランド自体は評価されないため、式の評価は行われない。
>>384
今のあんたの知識じゃ不可能。
C 言語以前の問題だな。
型名の後に空白を入れないコーディングスタイルは初めて見た。
>>390
sizeof(buf)
のことか?w

酔っ払いの自爆ですた
失礼しる
>390
2chではTAB文字が消されるようになった
>>391-392
何をどう間違えたら(ry
>>385
int hex2int(const char *s) {
 int i;
 for (i = 0;; i++) {
  const char t[] = {i >> 16, i >> 8, i};
  if (!memcmp(s, t, 3))
   return i;
 }
}
>>395
消えろ
個数が静的に定まっていないn個の整数値を標準入力から配列へ読み取りたいのですが
fgets+sscanfを使って読み取る方法が分かりません。
scanfを使うと

for(i=0; i<n; i++)
scanf("%d", &var[i]);

となる物をfgets+sscanf使って実現したいと言うことです。
>>397
char buf[1024] = "";
for(i=0; i<n; i++)
{
  fgets( buf,sizeof(buf),stdin);
  sscanf(buf,"%d", &var[i]);
}
>>398
入力の大部分を捨てるつもりか?
400デフォルトの名無しさん:03/10/28 18:28
さらしage
401397:03/10/28 18:48
>>398
それだとうまく出来ないんです
bufに取り込まれた先頭の整数値だけ読み込んで残りを捨ててしまうので・・・
>>401
fgets+strtolでやってみれば?
fgets(buf, sizeof(buf), stdin);
for(i = 0, j = 0; sscanf(&buf[j], "%d", &var[i]) == 1; i++) {
  printf("var[%d] = %d\n", i, var[i]);
  while(isdigit(buf[j++])) ;
}
>>398
scanfよりfgetsとか嬉しそうに囀ってるバカたちの縮図だな
(398を非難しているのではない、こいつに変なこと吹き込んだ連中を揶揄している)
405397:03/10/28 21:52
>>402
char ** endptr;
gets(buf, sizeof(buf), stdin);
*endptr = buf;
for(i=0; j<n; i++)
input[i] = strtol(*endptr, endptr, 10);
で取得できました。ありがとうございました

>>403
isdigitなんて便利なものが有ったんですね・・勉強になりました
こちらもありがとうございました
ちなみにこのままだと負数の時の処理がおかしくなるので最後のWhile文を
do{k++;}while(isdigit(buf[k]) || (buf[k] == '-'));
としないとだめでした

402さんの方法だと上手くエラー処置を実現出来なかったので(strtolが良く分からなかった)
今回は403さんの方法を使わせてもらおうと思います
406デフォルトの名無しさん:03/10/28 22:21
メモリに関する知識がCを理解するためには(他の言語の場合以上に)役立つと
聞きました。聞いたのはいいとして、「なぜなのか」とか「何を調べれば良い
のか」がわかりません。

答え(or インデックス)を頂けませんか?
>>406
間違いなので気にしなくていいです。
>>406
言った本人にきかなきゃ。
409名無し:03/10/28 22:51
test
ポインタ絡みじゃないの?
>>406
cの言語仕様やプログラムの意味は、実行時のメモリモデルをもとに考えると
理解しやすい。
具体的には、様々な基本型、配列、構造体、共用体のデータについて、メモリ上で
どういうレイアウトで表現されるかを考えてみるのがいいのでは。

参考書としては『Cプログラミング専門課程』が、個人的に分かりやすかった。
412406:03/10/28 23:11
>>411
ありがとうございます。

これですか?
http://www.pro.or.jp/~fuji/mybooks/cpro/
Cの規格は実装依存のメモリとは完全に切り離されてると思うが
なので alloca みたいなスタック前提な関数は気持ち悪い
longjump とかも。
うまく使うと面白いがね
415デフォルトの名無しさん:03/10/28 23:46
Linuxでgccから手軽に使える画像処理ライブラリってありますか?
非XWindowsで扱いたいのですが。
イメージとしてはN88BASICの用に描画関数があるとありがたいです。
>>412
そうそう。
今はweb上で読めるんだね。
>>415
> イメージとしてはN88BASICの用に描画関数があるとありがたいです。
この程度ならtcl/tkのライブラリを呼ぶといいんじゃない。
418デフォルトの名無しさん:03/10/29 00:17
>>417
非GUI下でないとダメなんです
非XWindowsって
420デフォルトの名無しさん:03/10/29 16:56
Cでは変数に$を付けないのはなんでですか?
は?
>>420
考案者に聞いて下さい。
423デフォルトの名無しさん:03/10/29 17:15
Cに連想配列はないのですか?
424デフォルトの名無しさん:03/10/29 17:38
>>422
考案者はCさんという方ですか?
>>418
svgalibとか使えば
#include <stdio.h>
#include <math.h>

int prime(int x);

int main(void)
{
       int x;
       printf("Please enter the number.\n>");
       scanf("%d",&x);

       if(prime(x)){
              printf("This number is prime.\n");
       }
       else{
              printf("This number isn't prime.\n");

       }

       return 0;
}
int prime(int x)
{
       int a,b=2,c=0,i=1,n[10000];

       if(x==2){
              goto END;
       }

       if(x==0 || x==1 || x%2==0){
              i=0;
              goto END;
       }

       a=(int)sqrt(x);
       while(a>=b){
              if(x%b==0){
                     i=0;
                     n[c]=b;
                     c++;
              }
              else{
                     b++;
              }
       }

       END:

       return i;
}
入力されたのが素数かどうか、を調べるものです。
素数でない場合は配列dにはいっている約数を出力したいのですが
関数が違うので配列がそのまま使えません。
ポインタというのがむずかしくて・・・
要はmain関数で
for(略){
printf("%d",d[i]);
}
としたいのです。
どのようにすればいいか教えてください。
関数というのを習ってあえて関数使ってますので「関数使わなくていい!」
ってのは勘弁ください。
よろしくお願いします。
>>1をよく読んで(特に5行目)
出直してください
>>428
>printf("%d",d[i]);

「d」と言う配列が見あたらないのだが?
431デフォルトの名無しさん:03/10/29 20:28
int prime(int x){
int i;
for(i=2;i<=x/2;i++){
if(x%i==0){
printf("%d,",i);
}
}
printf("%d\n",x);
return (0);
}

int main(void){
char x[10];
gets(x);
prime(atoi(x));
return (0);
}
>>429
ありがとう。さようなら~
433デフォルトの名無しさん:03/10/30 00:44
>>428
え〜っと、いまいち良くわからんが
グローバル変数ならそのまま使え。

そうじゃなきゃ、例えば第1引数にバッファの先頭アドレスを
第2引数に表示する回数(確保した値以上は入れないように)
な感じか・・・

void Func(int *dat, int nloop)
{
for(int i=0 ; i<nloop ; i++)
{
printf("%d \n", dat[i]);
}
}

まぁ、構造体を使ったり等
やり方は人の数だけある訳で・・・
434デフォルトの名無しさん:03/10/30 01:59
すいません教えてください
ポインタ自体の型はどんなシステムでもintなんでしょうか?
>>434
なんかメチャクチャな表現で意味成していないけど、推測するに
sizeof(int) == sizeof(void*) かどうか、ってこと?
かならずしもそうとは限らない。64bit マシン用の C では、
sizeof(int) = 4, sizeof(void*) = 8 ってのは結構普通にある。
>>435
すいません
そういう意味です
mallocによって、あるオブジェクトの配列(ここで言うオブジェクトはint やchar* あるいは構造体など)
を確保しようと思っていたのですが、
ポインタはどんなものでもサイズ一緒なのでポインタを入れれば汎用的に使えていいんじゃないかと思いまして

>>436
sizeof(char *)とsizeof(int *)が同じとは限らない。
438デフォルトの名無しさん:03/10/30 07:58
>>437
それ おなじじゃないと動かないソフト ざくざく(笑)
>>437
そんな事は聞いてない
ポインタ は int じゃなくて、long じゃない?
あと、ポインタ=long なんじゃなくて、
ポインタ⇔long 間での変換が保証されてるだけ。
longじゃないし、保証もされていない
まあWindowsプログラムでは、そうだと信じなければやってられん訳だがな。
Winの場合INT_PTRは少なくともポインタを入れられるだけのサイズが保証されてるな
そりゃ、その為にintから置き換えられた物だもの >INT_PTR
445デフォルトの名無しさん:03/10/30 16:58
Cを独習してる者です。今while文とfor文を勉強してるんですが、入力正整数の総和を
求める、次の文をfor文に書き換えたいんですが8〜10行目がよく分かりません。
どこを直せばいいんでしょうか?


1 /* kasan.c */
2
3 #include <stdio.h>
4
5 main()
6 {
7 int a, sum;
8
9 sum = 0;
10 while (scanf("%d", &a), a>=0)
11 sum += a;
12 printf("souwa=%d\n", sum);
13 }

初歩的なこと聞いてすみません
446初心者:03/10/30 17:00
>>445
8行目は僕にもわかりました。
多分ですけど、何もしてないと思います。
447デフォルトの名無しさん:03/10/30 17:10
>>445
while (scanf("%d", &a), a>=0)をfor (;scanf("%d", &a), a>=0;)に
448デフォルトの名無しさん:03/10/30 17:14
>>447

それやってみたんですけど、うまくいかなかったんですけど
>>445
初心者がコンマ演算子なんかを使うのは混乱のもと。
for (;;) {
  scanf("%d", &a);
  if ( a<0 ) break;
  sum += a;
こんな風に1行づつ書くほうが分かりやすいぞ。
>>448
本当はやってみてないに100ペソ
451デフォルトの名無しさん:03/10/30 17:20
どうもありがとうございます。じゃあ10行目のところだけ直せばいいんですよね?
そのほかの行で直すところありますか?すみません
452デフォルトの名無しさん:03/10/30 17:26
/*こんな感じか? テストしてないから分からんが*/
#include <stdio.h>
int main (void){
  int input,sum=0;
  int i=0;

  printf ("整数を入力してください。"
      "終わるには、ただEnterキーを押してください。\n\n"
      "-->");
  for (;;i++){
    if (scanf("%d",&input)==EOF)
      break;
    sum+=input;
  }

  printf ("入力数は%d\n"
      "合計は%d\n",i,sum);
  return 0;
}
453452:03/10/30 17:27
スマソ ↑の結果表示を訂正する。
printf ("\n入力数は〜
454452:03/10/30 17:29
/*この方が良いか?*/
#include <stdio.h>
int main (void){
  int input,sum=0;
  int i=0;

  printf ("整数を入力してください。"
      "終わるには、ただEnterキーを押してください。\n");
  for (;;i++){
    printf ("\n-->");
    if (scanf("%d",&input)==EOF)
      break;
    sum+=input;
  }

  printf ("\n\n入力数は%d\n"
      "合計は%d\n",i,sum);
  return 0;
}
455デフォルトの名無しさん:03/10/30 17:30
3Dチャットの上に飛んだりするプログラムってC言語ですか?
456445:03/10/30 17:30
どうもありがとうございました
457452:03/10/30 17:33
>入力正整数の総和

ああ、良く読んでなかった。
ハイ、バカです俺。初心者です。
if (scanf("%d",&input)<0)
>>457
初心者だと思うのなら、せめて実行確認してはどうか。

> if (scanf("%d",&input)<0)
ここにいる香具師ってさあC++もできるわけ?
できるなら。Cの文法だいたいわかってるやつが++わかるのに
どれくらいかかるか漏れは知りたい。
>>459
C++スレで聞いたほうが良い。
ここは++の話をするだけで怒るヤシが居るから。
Cでそれなりのプログラム書いてる香具師なら、
禿本に書いてあることにまあたいていは頷けるようになっているはず。
KRもそうだが初版のほうが簡潔でわかりやすい。
金と時間はかかるが初版→2版→3版→ISOと読み進むことをすすめたい。
なぜなら禿自身と同じ習得パスを通れるからだ。
462459:03/10/30 21:11
ふーん・・・・。もう寝るわ。
お(^o^=) や(o^O^) す(^。^o) みー!(o^-^)ヾ
463459:03/10/30 21:17
>>462
漏れになりすまして何をしたい?
>>463
いるなら460と461に返事しろよ
465459:03/10/30 21:46
>>460 わかりますた
>>461 長い道のりでつね
>>464 礼儀というのは大切でつよ。
466デフォルトの名無しさん:03/10/30 23:04
>>459
なんだそれ。
そんなもんピンキリだろ。
467343:03/10/30 23:30
すごく簡単な質問なんですが、Borland C++ Compiler 5.5で剰余の%を
使っても計算してくれません。どうしてですか?
まず、今のもまいの能力全開で単純化した再現コードを晒せ
本来はそれを2chではなくコンパイラ屋につきつけるものだが・・・
どうせfloatかdoubleなんだろ
>>468
main(){printf( "57 % 3" );}
ポカーン
472デフォルトの名無しさん:03/10/31 00:55
ワラタネタカ?
printf("%d", 57%3);
>>470
printfの場合は%は二つ重ねなきゃ☆
printf("1 + 2"); はできてたのか?
>>465
こいつの言う礼儀ってのがわからん。
476デフォルトの名無しさん:03/10/31 20:02
・俺を怒らせるな
・無視をするな返事をしろ
・俺に対しては敬語を使え
・ときどき俺を誉めろ。感謝しろ

これ、おまえらが尽くすべき礼儀の一部
無礼すぎる奴も、恩着せがましい奴も

 両 方 嫌 い

こいつらの共通点は自己虫俺様節
どんな形であろうとそこにいるだけで迷惑
478デフォルトの名無しさん:03/10/31 22:42
厨房よ
そのゆとりの無さがなくなるまでのわずかな間だけが子供として生きられる時間だ
大切に生きろよ
479デフォルトの名無しさん:03/10/31 22:42
厨房よ
そのゆとりの無さがなくなるまでのわずかな間だけが子供として生きられる時間だ
大切に生きろよ
MD5のアルゴリズムの参考ソースが転がってるサイトねーっすか…
ググったけどなかなかいいのがなくて∧||∧
七行スレにCのMD5があった程メジャーなんだから、まともなソースを解説してるのも見つかるよ
単に検索するキーワードが不適切なだけだろ
構造体メンバーのsizeofをきれいに取得するにはどう書いたらいいですか?
struct A {
 int data[10];
};
があって、dataのサイズが変わる可能性があるとします。

このとき、関数内部等で
struct A *p;
int limit = sizeof(p->data)/sizeof(p->data[0]);
とすれば簡単にdataの上限値がわかるのですが
struct A型の変数を宣言せずに取得できませんか?
offsetof(の一般的な実装)のように0(または何らかの値)を
struct A*にキャストして求めるしかないんでしょうか?

もちろん、
#define DATA_SIZE 10
struct A {
 int data[DATA_SIZE];
};
とすればよいのはわかっています。
sizeof(struct A)
つまんね
sizeof(struct A.data)っていけたっけ?
ポインタになってるならsizeof( A->data )
構造体のままならsizeof( A.data)でもいけるか?
>>483
構造体には詰め物が入るかもしれないぞ。
>>485
無理
488デフォルトの名無しさん:03/11/01 11:43
オープンソースのソフトとかで、gccとかcl.exeとかのCUIのコンパイラ
でメークファイルを書いてる人たちは、どういう風にデバッグしてるんですか?
まさか printf埋め込んだりしてるんですか?
ひとそれぞれ。
490デフォルトの名無しさん:03/11/01 12:26
>>488
infoでも読んでおけ
>>482
どんな変数でも良いから,(struct A*)へキャストしてしまえ。
((struct A*)main) とかな。
>>491
「どんな変数でも」は間違いだろ。ポインタにキャストできるものならなんでも。
493492:03/11/01 14:52
sizeof ((struct A *)0)->data;

こんな感じか?
>>491-493
少しは元レスを読んでやれよ。

> offsetof(の一般的な実装)のように0(または何らかの値)を
> struct A*にキャストして求めるしかないんでしょうか?
>>482
「dataのサイズが変わる可能性」と言っているのが
コンパイルしたときにデータのサイズが確定するのなら…

それでいいんじゃない?

そのためには構造体を知るためにヘッダファイルをインクルードすることになるんだろうけど、
そしたら
sizeof(p->data)/sizeof(p->data[0]) は常に DATA_SIZE と同じになると思うんだが。
496デフォルトの名無しさん:03/11/01 16:43
配列じゃなくてpointerと動的確保に変わる可能性もあるんだから
そういうのは確保時にいくら確保したのかをちゃんと残しておく
そこまで前提を覆すと問題にならない
498デフォルトの名無しさん:03/11/01 17:25
初心者です。MATRIX_REVOLUTIONS_WORKPRINT.wmv 736,332,736
12a022010bde0db99ccf8a8a607fcd86などの文字ををC言語に変換してプログラミング
するってどのようにすればいいのですか?
出直せ。
>>498
ネタだとしても全然つまらん。
501デフォルトの名無しさん:03/11/01 17:43
ネタじゃねーよバーカ 氏ね 
502デフォルトの名無しさん:03/11/01 17:45
無知な初心者が書いてんじゃねーか 少しは丁寧に違うということを 
教えてくれったていいじゃねーかよ 
イタタタ
>>502
あなたさまが、あなたさまの納得のいく回答を期待することが間違っております。
あなたさまの貴重なお時間を無駄にするのも心苦しいので、
どうか、2度とこの板にお越しになりませぬよう、ご進言申し上げます。
どっかの国の人みたいな理屈だなw
506デフォルトの名無しさん:03/11/01 21:21
ん〜と、説明しにくいのですが…、
構造体のメンバを構造体変数同士でコピーしたいのですが、
メンバがint型ならば、コピーできるのですが、メンバが文字型だと、
うまくコピーできません。

どうすればいいのでしょうか、解りにくくてすいません。

void SELCT(struct states *p , struct rec *r )
{
int count=0;

scanf("%d",&count);

//↓これがうまくいかないのです
p->name = r[count].name;

p->win= r[count].win;
p->lose = r[count].lose;

}
>>506
だったら構造体もさらすのがよいかと。
508506:03/11/01 21:30
解りにくすぎるので補足します。

struct
{
int win,lose;
char name[100];
}player;

struct
{
int win,lose;
char name[100];
}enemy[10];

メンバnameは文字配列です。
C 言語は配列の代入はサポートしてないよ。
strncpy() とか見てみるべし。
510デフォルトの名無しさん:03/11/01 21:35
そうなのですか…。

ならば、
strcpy(p->name,r[count].name);
というのも無理ということでしょうか。

今から少しヘルプを見てみますが、
多分、解らないので、こういうやり方があるぞっていうのが
ありましたら、教えてくださるととてもうれしいです。

ご指南、ありがとうございます。
char aaa[100] = "string";
char bbb[100];

bbb = aaa;

これはむりなんだよ。>>509 のいうとおり。
もしくは >>506 のコードで *p = r[count] とするか。
>>510
それは可能 < strcpy()
>>506
構造体そのものならコピーできるってことは知ってるのかな?
514デフォルトの名無しさん:03/11/01 22:15
構造体のコピーで次の2つはコードを生成したときに
どっちが優位とかありますか?

copy_hoge(struct HOGE* d, struct HOGE* s){
 
(1) memcpy( d , s , sizeof(HOGE) );
(2) *d = *s;
 :

言語の範囲で決まってるかどうか、自信ないけどおながいします。
>>514
コンパイラによっては、同一のコードになったりするから、オブジェクトコードの優位性についてはどっちが優位とかは一概には言えない。

でも、構造体コピーできない大昔の処理系を除いて、(2) で問題ないと思う。
>>515
なるほど。
大昔は *d = *s とかできないものもあったんですね。
特別な理由が無い限り(2)の書き方するようにします。

どうもありがとうございました。
typedef struct { char c[100];} name_t;
struct
{
int win,lose;
name_t name;
}player;
struct
{
int win,lose;
name_t name;
}enemy[10];

//↓これもうまくいくのです。
p->name = r[count].name;
>>514
その「生成した」コードは見たのか?
きれいごと言う前に汗かけよ自分で。
>>518
自分の処理系ではどうのと調べてから質問してみたんですが
なんか差し支えがありましたか?
駄洒落だろ
>>520
なるほど!
(´Д`υ)
523デフォルトの名無しさん:03/11/02 01:35
p[i]のpとiが交換可能なのは*(p+i)と等価だから、という解釈で良いのでしょうか。
*(i+p)ってかけるか?
525523:03/11/02 01:40
>>524
即レスありがとうございます。
gccで試したところ*(p+i)も*(i+p)もちゃんと動きはしたんですが・・・
すまん。試さずに漏れの疑問を投げかけてしまった。
だったら>>523の答えはそうなるんじゃない?
ベースとオフセットがきまればなんでもいいって事になるな。

i[p] p[i] *(p+i) *(i+p)

"0123456789ABCDEF"[3] とか 3["0123456789ABCDEF"] とか。
"0123456789ABCDEF" + 3 とか 3 + "0123456789ABCDEF" とか。
528デフォルトの名無しさん:03/11/02 01:51
sizeof(ary)で配列のバイト数が取れますが、
関数の引数で渡ってきた配列に関しては
できませんでした。なぜですか?
529デフォルトの名無しさん:03/11/02 01:52
>>528
引数で配列そのものは渡せませんが?
530デフォルトの名無しさん:03/11/02 01:54
>>529
なるほどそういうことですか。。。理解しました。
すまそ。
531デフォルトの名無しさん:03/11/02 01:57
スミマセン、初歩的な疑問なのですが

関数を呼び出したとき
int hoge(int i)
{
int x,y;
return i;
}
returnした後も上の関数で言うxとyは開放されないのですか?
>>531
いや。関数終了時にそこは x と y の領域ではなくなる。
533523:03/11/02 02:14
ありがとうございました。
4["Hogehoge"]ってのも何かとんでもない所を指してそうで気持ち悪いですけどちゃんと動くんですね。

argv[4][3]は4[argv][3]と3[4[argv]]と等価? 頭痛くなってきた…
534531:03/11/02 03:05
>>532
ええと、まだ初歩的な愚問をしてもいいですか?

もし関数内でデータをメモリにロードして
関数内で宣言したポインタでそのデータを指して使うとして
関数がreturnした時、そのロードしたデータはどうなりますか?

すみません。意味不明なこといってたらスルーしてください
char * function()
{
 char buffer[1024];

read_buffer(buffer); /* buffer にデータを読み込んだ */

return buffer;
}

もし、こういうことだったらそれはできない。
この関数を抜けたときに buffer は開放されているから。

こういうときは呼び出し側でバッファを用意するのがいいとおもう。
>もし、こういうことだったらそれはできない。
補足。

これは、return buffer されたアドレスのデータを、呼び出し側の関数で
つかっちゃだめよ、ってことね。
>>535-6
ありがとうございました。
static char buffer[1024];
>>538 == static覚えたて厨
>>539 == static の意味を今理解した香具師
そんな煽りはありえない
malloc
>>542 == malloc覚えたて厨
>>543 == malloc の意味を今理解した香具師
そんな煽りはありえない
free
exit
>>546=free 、exit 覚えたて厨
代入文には左辺値が必要です
>>547 == free,exit の意味を今理解した香具師
>>548 == 代入文、左辺値覚えたて厨
 
>>538-549 へんなことスルナ!

質問はもうないのか。
>>550
538は別だろ
そんな煽りはありえない
>>536
補足の補足。
少しトリッキーになるが、リターン先で呼び出し先のスタックが生きてい
るうちに返されたアドレスバッファの内容をどっかにコピーすれば使える
が、知ってて使わないと色んな意味で危険。
トリッキーじゃなくてデンジャラス
知ってて使っても色んな意味で危険。
>>553
ダンゲロス!
>>556==ダンゲロス覚えたて厨
ダンゲロスって何なんだYO!
お前ら糞レスしている暇があったら新スレ立ててこい。
ダンゲロスのせいで >>559 がおかしくなった。
お前ら責任取れよ。
だってダンゲロスじゃんかじゃんかYO!
ひょっとしてダンゲロウスの間違いかな?
dangerous
ダンゲウロスは馬っぽいけど、ダンケロスは怪獣っぽい。
>>562
ウワァァァァン!
566デフォルトの名無しさん:03/11/02 19:58
つーか、どの言語もバカばっかりで安心しました
C++スレから追い出されたんですね。
568デフォルトの名無しさん:03/11/02 20:05
>>567
いえ、ジャバです
でも追い出されたわけではなく
自分のCの勉強の合間に一応全部見ておこうと
スレを見てきたんですが、539あたりから
ジャバスレと同じような展開が随所に見られ
「ああ、どこにでもこういう人たちはいるんだな」
と、安心したわけです
ちなみに俺の言う「バカ」は、けして悪い意味ではありませんので・・・
>>539以降は漏れだけだよ。
570デフォルトの名無しさん:03/11/02 20:12
>>569==あぶり出しに引っかかった、オレンジ厨
クスクス
アフリカ料理食いたいね
573貧乏紙:03/11/02 21:59
フランス料理って物を一度ちゃんとしたとこで食べてみたい・・・
でも、作法がよくわからんし。。。
574デフォルトの名無しさん:03/11/02 22:03
ふふぉぺn
作成したファイルを fclose した後にそのファイルを削除しようとしても使用中っていわれてできません.
でも、プログラムを閉じると削除できます。 どこが悪いのでしょうか?
>>575
まじっすか!ソースプリーズ!
同じファイルを複数回開いて一度しか閉じていないとか。
>>576
脅かしすぎw
>>575
fcloseの位置をfopenに少しづつ近づけて調べていけばいいよ。
580デフォルトの名無しさん:03/11/03 08:27
すいません、<string.h>の関数はすべてC言語でつかえるんでしょうか?
>>580
string.h って C 言語のヘッダなんだが。
582デフォルトの名無しさん:03/11/03 13:46
GAZA-CとZ+ではどっちがお得でしょうか?
583デフォルトの名無しさん:03/11/03 14:18
数値定数、単精度実数型、固定小数点形式、整数型、倍精度定数型
これらの意味が載ってるサイト無いですか?
>>582
Z+を色塗りすればアムロ専用だと自慢できるので御得です。
>>583
無い
>>585
意味教えてもらえませんでしょうか?
って大変ですよね 参考書になら載ってるかな?
他のはググれば見つかる
>>588
ありがとうございます
単語で検索してなかったです
でも倍精度定数型は無いんですね
実数型ならあったのでもしかして教科書の間違いかな
すみません、初心者丸出しで恥ずかしいのですが、

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

cnt = sizeof(data) / sizeof(**data);

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

って感じのプログラムなんですが、
cntへの代入文の所で、data配列全体のサイズを、なにで割っているのかが分かりません。
ポインタ変数に*をつけると、中身参照だと教わったのですが、
配列名につけた場合、(**data)というのは、どこを指しているのでしょうか。
教えてください・・・。
>>590
ポインタでも配列でも、*P は P[0] と **P は P[0][0] と同じ。
>>589
const double
593590:03/11/03 17:31
>>591
レスありがとうございます。
**PがP[0][0]ってコトは、上の場合、(**data)が指してるのって、「1」ですよね。
sizeof(1)ってすると、int型の大きさがちゃんと返ってくるんですか??
sizeof(1.0)とかってしたら、floatかdouble型の大きさですか?
見当違いなこと言ってたらすみません・・・
あんたのコンパイラは
int a=10000;
printf("%d\n",sizeof(a));
で10000を表示するのか?
>>593
sizeof **data は sizeof data[0][0] と同じ。
要するに、一要素のサイズ。
>>594
ニホンゴワカリマスカ?
「int型の大きさ」と「intの変数の値」は全然違うものだぞ。
597590,593:03/11/03 17:55
>>595
あ、そうか!
sizeof(data[0][0]に入っている値のサイズ)っていうより、
sizeof(data[0][0]のサイズ)って意味ですね!
ありがとうございます!!
>>597
ちなみに括弧はいらない
必要なのは型の大きさを知りたいとき(キャスト式なんだそうだ)
>>598
そうなんですか!勉強になります。m(__)m
600
601デフォルトの名無しさん:03/11/04 09:21
プログラミングの力を生み出す本―インテルCPUのGNUユーザへ
橋本 洋志 (著), 松永 俊雄 (著), 冨永 和人 (著), 石井 千春 (著)

この本ってかなーり初心者向けの本ですかね?
スレ違いですみません
読んだ人います?
ゲームにあるセーブ機能ってC言語でいえばファイル操作関連?
比較対象が意味不明だが…
ファイル操作というよりむしろポインタの退避の方が近いんじゃないのか?
ポインタ退避…
何をセーブする積もりだ?
オブジェクト間のリンク
すまん
ポインタじゃなくてプログラムカウンタの間違い
>>604
ポインタ=メモリとして、エミュレータによくあるリアルタイムセーブとか。
608602:03/11/04 21:24
例えばのそのゲームに使っている変数をすべてセーブしたい時とか。
>>608
このスレはCオンリーだから他スレで聞いた方が良いよ。
>>602
どこにデータをセーブするかによる。
一般的なPCのゲームだとINIファイルやレジストリに保存するだろうし。
コンシューマならメモリカードなど、電池によって電圧を与えてるRAMだろうし。

INIファイルならファイル操作、
レジストリならレジストリ操作、
と言った感じに時と場合による。
>>610
PCゲームってやったことないでしょ?
>>610
INIファイル・レジストリは通常、設定に使うのであって
セーブデータとは違う罠
レジストリ汚すゲームは人によっては非常に嫌われる。
>>610
>コンシューマならメモリカードなど、電池によって電圧を与えてるRAMだろうし。
「電池によって電圧を与えてる」という言い回しが怪しいですが、それ以前に
ふつーはフラッシュメモリですね。バッテリなんか使いません。
615デフォルトの名無しさん:03/11/05 01:38
iconv()に関して質問させてください。
static int KONBU(char *to_code, char *from_code, const char **inp, char **outp, size_t *inl, size_t *outl)
{
iconv_t icv_hook;
size_t ret_val;
icv_hook = iconv_open(to_code, from_code);
if(icv_hook == (iconv_t)-1)return(ANS_ERR);// NG Return
ret_val = iconv(icv_hook, inp, inl, outp, outl);
iconv_close(icv_hook);
if(ret_val == (size_t)-1){
if(errno == EILSEQ) printf("EILSEQ\n");
else if (errno == E2BIG) printf("E2BIG\n");
else if (errno == EINVAL) printf("EINVAL\n");
return(ANS_ERR);// NG Return
}
return(ANS_OK);// OK Return
}
上記のようなiconv()を用いた関数があります。
unsinged char *sb, db;
ret = KONBU("JIS7", "PCK",(const char **)&sb,(char **)&db,2,8);
そしてこのように呼び出しており、unchar sbには
83 31 83 32 83 34 ....といったようなデータを渡しています。
実行結果はEINVALが返ってきます。
ここで質問なのですが
@第5引数の2はsbを2バイトずつ読み込むということでよろしいのでしょうか?
A第6引数の8は何を指すのでしょうか?
Bsbには0x81 0x31 ....というようにヘキサを読み込ませているつもりなのですが
そもそも文字列で渡すべきなのでしょうか?
CEINVALのエラーの意味がよくわからない。
以上4点になります。
厨な質問かとは思いますがご教授お願いいたします。
>>615
>>1
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
617615:03/11/05 02:02
>>616サン
ご忠告ありがとうございます。
早速他所に書き込みました。
618デフォルトの名無しさん:03/11/05 03:25
質問させてください。
void main(){
int a[ARRAY_MAX] = {0};int b[ARRAY_MAX] = {0};
int i;int *ptr;
for(i = 0;i<ARRAY_MAX;i++)a[i] = 1;b[i] = 1;
ptr = add(a,b);
printf("ptr:%d\n",ptr);
printf("%d",*ptr);
return;
}
int *add(int *x, int *y){
int anser[ARRAY_MAX];
int i; //for文カウント用
 int remain = 0; //計算の余り
for(i=ARRAY_MAX-1;i>=0;i--){
anser[i] = (*(x+i) + *(y+i) + remain)%10;
remain = (*(x+i) + *(y+i) + remain)/10;
printf("x:%d y:%d remain:%d\n",*(x+i),*(y+i),remain);
}
printf("anser:");
for(i=0;i<ARRAY_MAX;i++)printf("%d",anser[i]);
printf("\n");
printf("%d\n",*(&anser[0]));
printf("&anser[0]:%d\n",&anser[0]);
return &anser[0];
}
こんな感じで、ptrに配列の先頭アドレスを渡しているのですが、
ptrと&anser[0]のアドレスは一緒になるのですが、
*ptrと*(&anser[0])が別の数字になってしまうのですが、
どこが間違っているのでしょうか?
>>618
anserはローカル変数で関数の中でのみ有効。
add()からmain()に戻った段階で、有効ではなくなっている。
有効でなくなったんで、他の処理で使ってしまっている。
620618:03/11/05 04:39
>>619
なるほど。
メモリに書き込んでるから、別にローカル変数だとか気にしなくて
いいと思っていたんですが、そうではなくて、スコープから出たとたん
結局リセットされてしまうのですか。
とりあえず、anserを環境変数にします。
ありがとうございましたm(__)m
>>618
× anser
○ answer
>>615
>static int KONBU(char *to_code, char *from_code, const char **inp, char **outp, size_t *inl, size_t *outl)

このプロトタイプで

>ret = KONBU("JIS7", "PCK",(const char **)&sb,(char **)&db,2,8);

と言う呼び出しは出来ないだろ。(ワーニングくらい出てないか?)
第5引数、第6引数はsize_t型変数へのポインタを渡せよ。
623デフォルトの名無しさん:03/11/05 11:41
bitmap等の画像ファイル形式について質問します

PNGやJPEGファイルのヘッダ部分、データ部分を取得したいのですがPNG/JPEGの取得方法がわかりません。。
PNGやJPEGファイルをBITMAPFILEHEADERにいれたいのですがどうすればいいのでしょうか?

ご教授お願いします
>>623
まずはPNG/JPEGのそれぞれのファイル形式を調べれ。
後はそのフォーマットに従ってファイルを読んでいけばいい。
質問です!
あるCのプログラムを実行すると、.datファイルに10000個
のx、y座標がたてに表示されるんですが、
これをグラフにしたいんですよ。
そういう場合はどうすればいいんですか??
gnuplotでも使え。
627デフォルトの名無しさん:03/11/05 13:35
>>625
Excel
>>
gnuplot!?今調べてみます。

>>627
最後の表示も全部Cでやんなきゃいけないらしくて
629デフォルトの名無しさん:03/11/05 13:38
for(i=0;i<1000;i++)
>>628
どういうグラフにしたいかによる。
グラフィックを使ったグラフにしたければ標準Cでは無理なので、
該当の環境スレにGO!
631デフォルトの名無しさん:03/11/05 14:22
>>625
X とYの間にカンマを入れてCSVに変換→エクセルでグラフ。
ポインタで
int* p;
って書くのと
int *p;
って書くのではどちらが一般的なの?

int*
p;
が一般的
>>632
int *p;が推奨されるが、
int* p;と書く馬鹿が多い。
どこで推奨されてるのかな
636ヽ(´ー`)ノ:03/11/05 17:20
俺は int* p 派だが、他人が読むコードなら int *p の方がいいと思うよ。
ベタでだけど、
    int* a, b;
って書いた時に
    int *a;
    int b;
にしかならない。
638デフォルトの名無しさん:03/11/05 17:29
高橋 麻奈 さんのやさしいCを買おうかと思ってたんですが
第2版が出たみたいなんでそっちにしようかと思ってるところなんですが
何かかわってるところがあるんでしょうか?
type* var; と書く人間は、一行づつ変数宣言する事を前提にしてる気もするな。
640ヽ(´ー`)ノ:03/11/05 17:31
>>639
うむ、その通りだ。
>>632
ソースいっぱい見て自分で判断しろ。 
まあ7割がたint *p;じゃないかな?
関数ポインタだと大抵
int (*func)(void);
じゃ無いかな
int(* func)(void);
ってのは見たこと無い
それはちょっとズレた指摘じゃないかい。
int* pと書きたがるのは、型をまとめたいからであって、
アスタリスクと識別子の間に空白を入れることが主じゃないでしょー
int*pはint*型のpを宣言するんじゃなくて
*pと書くとint型になるpを宣言するんだと何度(ry
何度繰り返すのも勝手だが、同意する人間ばかりじゃないってだけ。
>>645
同意する・同意しないの問題じゃないんじゃないかと。
int *pとint* pの話してんじゃねーのか?
Javaからの逆輸入坊がint* p使うんじゃないの?
Javaだと配列もint[] aになるし。
多分int *pの方が多いんでしょう、気になる人はソース集めて統計取ってみてください。
んじゃそゆ事で。
650デフォルトの名無しさん:03/11/05 18:11
どこかでアンケートとっていないものかな
>>634の時点で既に話が逸れている
コーディングスタイルは人を侮辱するためのものではないし
数の権力で押し付けをするためのものでもない

合理性の観点だけでは勝負がつかないことは現状が証明している
・個人で書くならあなたが法律
・仕事で書くなら雇い主のルールに従え
それだけのことだ
将来プロになる可能性のあるアマは
色んなコーディング基準をそれぞれ完璧に守ってみる練習をしておくといい
ポインタはtypedefで専用の型を作ることが多いよ。
653デフォルトの名無しさん:03/11/05 18:21
Cでグラフィック描きたいのですが、本屋行っても関連書籍がないんで
すよね・・・。Cでグラフィック表現てどうしたらいいのでしょうか?
>>651
だから新人を合理的な観点から導かれる書き方をするように教育することで現状の俺様スタイル乱立の現状を是正しようという試みです
教条主義者ってスゲーな
>>653 
 "Cでグラフィック"で検索して下さい
657653:03/11/05 18:34
いろいろ検索かけましたよぉ
でも中見てもサッパリ('';?
本も無い、サイトも無い、まともなレスも無い
事から導かれる結論は?
自分のスタイルに執着するとろくな事がないだろう
660ヽ(´ー`)ノ:03/11/05 18:54
>>653
>>1 ぐらい読んでくれ。
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
GUIの意味が分からなかったに100ペニー
標準Cでできると思ったに120ペニー
663デフォルトの名無しさん:03/11/05 19:14
int* p;
665デフォルトの名無しさん:03/11/05 19:19
* p;
:-P
>>665
サイクロプスか?
>>658
本がないなら、とりあえずK&Rからだろう。
669デフォルトの名無しさん:03/11/05 19:25
>>668

K&R>>>>>>>ANSI
670デフォルトの名無しさん:03/11/05 19:25
int* *p;
671managed C++:03/11/05 19:27
int^p;
int *p;ってint* p;とも書けるのか。int型のpointer変数であるpっていう風に読むんだったら
int* p;の方がしっくりくるな。
673デフォルトの名無しさん:03/11/05 19:49
>>672
でもポインタを並べて宣言するときは
int *p1, *p2, *p3;
であって
int* p1, p2, p3;
ではないよな

ポインタ変数であるって読むんなら
変数名の方につけるべきじゃないか?
デジャビュですな
>>672
フリーフォーマットだから改行してもOKだし
かくして LPINT, LPLONG のように大量にtypedefしたヘッダができあがった。

677デフォルトの名無しさん:03/11/05 19:56
いーじゃんどっちでも
大体最初からコンパイルとおらないようにしておけばいいものを
両方とおちゃうもんだから、ややこしくなる
envpも標準にしてくれればよかったのにぃ
getenvがあるくらいだから仕様に環境変数というものはあるはず。
typedef int *PrINT;
typedef int* PlINT;
typedef int * PmINT;
typedef int*PcINT;
...
680デフォルトの名無しさん:03/11/05 20:14
>>678
envpは標準ですよ
main(int envp
682デフォルトの名無しさん:03/11/05 20:40
>>681
ああなるほど

(´・ω・`)
683デフォルトの名無しさん:03/11/05 22:22
C言語の"C"って何か頭文字ですか??
>>683
ALGOL->CPL->BCPL->B->C
間をとって
int * p;
空白を入れなきゃ悩むことはない
int*p;
>>686
そういうふうに書く奴いたよ。
そいつは配列定義を
char buf[ MAX_PATH ];
と書いてたし、if文も
if ( a == b && c == d ) {}
と書いてた。
bufと[の間をあけないのが不思議
char buf [ MAX_PATH ] ;
if ( ( a == b ) && ( c == d ) ) {}
関数名と引数部の間に空白入れるとカッコよく見えない?
 func  ( n1, n2); みたいなの。
>>691
正直かっこうわるい
>>691
それ空けすぎだろ、でも見易くなるのはあるかな。
(func (n1,
   (n2)))
;;; // ここまで書いた
>>691
関数名の後はスペースを入れず、制御文の後はスペースを入れる説。
func() exit(0) max(a, b)
for (i = 0; i < len; i++) while (true)
こんな感じ。関数名の後にスペースを入れる癖は、マクロ関数を定義する時に気持ち悪くなるかも。
スレ違いsage
今更な上に質問じゃなくてスマンが
data[0][0]と**dataが同じってことにちょっとビクーリしただよ。
個人的には制御構造も関数も「(」前にはスペース入れたくないな。
あくまで個人的な趣味だが。
>>697
うちではキーワードの次にはスペースを入れて、関数名の後には入れないことになってる。
って俺が決めたんだが。
>>698
ちなみに、何のためにスペース入れてるの?
>>699
何でかなぁ?そうするのが普通?みたいな感じ?
昔はxrefするときに見分けがついたほうがいいとか、いろいろ理由があった気もするが。
>>699
K&Rがそうだったから、という理由だったかもしれない。
いまどきK&Rなんて流行らない

int
main(argc,argv)
int argc;
char**argv;
{
return 0;
}
703デフォルトの名無しさん:03/11/06 02:50
プログラム中でユーザ名を得るにはどうすればよいですか?
システムコールで
user_from_uid(getuid(), 0)
とすればよいかと思ったのですが、
user_from_uid がない、でエラーになります。
よろしくお願いします。
704デフォルトの名無しさん:03/11/06 02:53
>>703
自分でuser_from_uidを実装する
705703:03/11/06 03:13
>704
んーと、できればそういうのはなしでお願いします。
あと、環境は Debian woody です。
Debian ではシステムコールでユーザ名って得られないんですか?
なんかうまい方法があれば教えてください。
よろしくお願いします。
>>705
・なんかの環境変数を見る
・`id`の出力をパースする
・/etc/passwdをパースする
とか?
getpwuid
>>702
一体、いつの版の話をしているんだ?
それに第1版のつもりなら
main(argc,argv)
char**argv;
{
return (0);
}
だろうがよ

時代遅れとか言うのは勝手だが
難癖つける前によく理解(ry
710デフォルトの名無しさん:03/11/06 09:26
フリーで、ライブラリリファレンスはないでしょうか。
参考書とかで、iostream.hをインクルードとか言われても、
それインクルードして他なにが使えるの??って感じで大問題です。
使用しているコンパイラはBorland C++ Compiler 5.5.1です。
>>710
あなたはインターネット初心者ですか?
>>711
それを憶測させる根拠は?
>710が疑問に思ってることはCの初歩の初歩でしょ。
そんなの検索すりゃいっぱい出てくる。
そういった自助努力もせず、すぐ人に頼るのはいかがなものか・・・
なんでもフリーで手に入れようとする所とか?
>714
はぁ?
手段の話をしてるのに何でフリーって出て来るんだ?
筋違いな話は遠慮してもらいたい。
710が初心者かどうかって与太話じゃないのか
710は小学生?
>>717
で、それを憶測させる根拠は? (w
710が初心者だろうが小学生であろうが関係ない。

1つ言いたいのは人に訊く前に自分でやることがあるだろう、
ってことだけさ。
みんな煽られて(ry
710が釣り師ってことでOK?
>>712
ググれやボケ!
723デフォルトの名無しさん:03/11/06 13:02
配列の作り方を教えてください。
int[] array;とやったのですができませんでした。
int array[1];
なんか一冊くらい本嫁
>>723
入門書くらい嫁
726デフォルトの名無しさん:03/11/06 16:10
>>723
Javaだね?Javaからの参加組ですね?
あっりゃー
728デフォルトの名無しさん:03/11/06 20:13
C言語で、文字列を受け取ってアスキーコードを返す関数はありますか?
または関数が無ければその方法を教えてください。

あと、des暗号をC言語で実現しようと思うのですが、
参考になるサイトはありますか?
文字列のどこをアスキーコードにする気ですか?
730デフォルトの名無しさん:03/11/06 20:18
ちょっと詳しいことはわからないのですが、
A〜Z、a〜z、0〜9の文字で構成された
任意の8文字をアスキーコードに変換したいのです。

説明不足だったらすみません >>729
731デフォルトの名無しさん:03/11/06 20:21
デコンパイラってどんなのがいいですか?
C言語になおすやつで。
>>731
さっきから逆アセンブルについて聞きまくってる馬鹿ですか?
734732:03/11/06 20:24
ああそういうことか・・・
>>730
sprintfで一文字ずつ数字列にすれば。
charがASCIIコードの保証がないので、テーブル作るのが一番楽かな
736デフォルトの名無しさん:03/11/06 20:30
>>733
んにゃ。今来たとこですが。
そか、ここID表示されないんだっけ
737デフォルトの名無しさん:03/11/06 20:33
宣言時にNULLが代入されるようなことはできませんか?
Hoge hoge = NULL;
としないでも
Hoge hoge;
とするだけでNULLが代入されてほしいのですが...
べつの言語をつかいましょう。
739デフォルトの名無しさん:03/11/06 20:46
int main(argc,argv)
int argc;
char *argv[];
{
関数内部
}

↑こんな関数を見かけたのですが、これは
実行時の第一引数が数値で、第二引数がargv[0]、
第三引数がargv[1]・・・・となるのでしょうか?

他人のソースで、実行のしかたがわからなくて困っております。
どうかよろしくお願いします。
いいえ。第一引数が argv[1] です。
>>737
そのHogeってのがポインタなら関数外に書けば入る
742デフォルトの名無しさん:03/11/06 20:58
argcはプログラムを実行するときに渡した引数の数
argvはその文字列を格納
743デフォルトの名無しさん:03/11/06 21:01
>>740 >>742 ありがとうございました。
>>742
引数の数+1
745デフォルトの名無しさん:03/11/06 21:08
>>744
スマン 本体いれるのわすれてた・・・
>>739
ずいぶんと古い書き方だな
747701:03/11/06 23:54
>>698
>>699
>>701
だ。
連想配列使いたい
>>748
自作しれ
750デフォルトの名無しさん:03/11/07 17:25
超初心者で済みません。
エディタはTeraPadを使っているのですが、
エスケープシーケンスの"\"を入力する方法をどなたか教えて下さい。。
キーボードで入力すると"\"か"_"で表示されて文字コード表からコピーしても違う文字になってしまいます、、、、。
円マークも右スラッシュも同じ。
「右スラッシュ」ってはじめて聞いたかも。
753デフォルトの名無しさん:03/11/07 17:33
キーボード配列上の左右?
>>751
逆スラッシュね。揚げ足ご苦労さん。
755デフォルトの名無しさん:03/11/07 17:35
質問です。
まず、100人分5教科の点数をデータにしました。G[101][5]としてあります。
それを読み込んできて、全員の各教科ごとの偏差値を出し、ファイルに書き込みたいのです。
偏差値計算に必要なものは、各教科の平均点、標準偏差です。
3つfloatを使ってやるというヒントはもらったのですが、さっぱりです。
ヨロシクお願いします。
>>754 は混乱している模様。
>>755
1ベースインデックスの悪寒・・・
758755:03/11/07 17:42
>>757
ってなんですか?
質問に不備あったら聞いてください。。。よろしくお願いします。
759ヽ(´ー`)ノ:03/11/07 17:48
(´-`).。o(…バックスラッシュちゃうん?…)

>>755
>>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
760デフォルトの名無しさん:03/11/07 18:06
すいません
printfは危ないって聞いたんですが
どこがどう危ないんですか?
具体例を教えてください

ちなみにgetsが危ないのはわかりました
761デフォルトの名無しさん:03/11/07 18:11
getsがいかなる意味で危ないとわかったのかを書きなさい
>>760
>printfは危ないって聞いたんですが
フォーマットバグのことか?
お前程度が作るプログラムなんて、誰もクラックしたがらんから大丈夫だ。
「sprintfと間違った」に100ルピー
ユーザーからの入力をそのままフォーマット文字列として渡すことだろ
printf(str);
こんなことする人見たことない・・・・
>>765
実現可能性のあることなので、実行するやつはいる。(by まーふい)
見たことあるよ。
768デフォルトの名無しさん:03/11/07 21:38
たとえば次のようなコード

typedef int HOGE_ARRAY[100];

int main()
{
  HOGE_ARRAY hoge;
  func(hoge);
}

void func(HOGE_ARRAY ha)
{
  int i;
  for (i = 0; i < 100; i++)
    ha[i] = i;
}

これはfuncでちゃんと値が設定されて返ってきます。
配列はポインタ渡しとなるのですか?
Yes
>>768
何か一冊でも本を読め
771JPS ◆k2TxvFSFC. :03/11/07 21:49
配列はポインタなの。
でも配列とポインタは違うの。
配列=ポインタとなる場合があるの。
C FAQを見れば早いの。
>>769,>>770,>>771
ありがとござんす。
いや、この場合配列が要素を含めて丸ごとtypedefされているんで、
普通に配列の先頭を渡すのとはワケが違うのかとおもたですよ。
typedefは、typeをdefするだけだし。
774JPS ◆k2TxvFSFC. :03/11/07 21:52
>>772
タイプデファは単純に展開するだけなの。
ただ展開するだけだからプログラムの内部的には何も変わらないの。
オレも勘違いしてたの。
775760:03/11/07 21:53
>>761
getsはサイズをチェックしないので
文字列たくさんいれると溢れて
メモリ領域を破壊するので危ないみたいです

>>762
フォーマットバグという単語を使ってしまったのはミスでしたね
フォーマットバグとprintfで検索してprintfの危険性がわかりました(゚ー゚*)フフフ
%nを使うといいらしいですね
フォーマットバグって>>765のようなコードで起こるものじゃないの?
>>776
>>765のコードだと%n使われる可能性があるから危険だと

777get
>>777
>>775からは%nを使うとフォーマットバグを取り去れると読めるんだけど。
そうは読めませんね
>>779
「%nを使うといいらしいですね」と言っているが。
それと、760は「フォーマットバグ」という言葉を使っていないのに使ったと言っているのもよくわからない。
無理すれば検索時にprintfを含めずフォーマットバグだけで検索してしまったとも読めるけど。
>>775
(゚ー゚*)フフフ
よりも
( ̄ー ̄)ニヤリッ
の方がみんなが理解してくれたかもな
>>760=>>775は悪意がある方の人だね
ああそういうことか。
本当にいいわけじゃなくて、、、
>>760=775は、フォーマットバグを理解してないな。
じゃなきゃ、>>775みたいな発言は出来ない。
>>784
「いい」ってのはそれを使えばフォーマットバグを含んだプログラムのセキュリティホールをつつけるという意味らしい、、、
あ、785=783
787784:03/11/08 00:11
>>785
そうか、そういう意味だったか。
わざわざすまん。有難う。
つか>>781-782の時点で気付けよ
だからこその>>782
790デフォルトの名無しさん:03/11/08 02:21
質問です!

文字列でないバッファーの中に
アスキー値が 'A' 'B' 'C'の並びで連続するアドレスを得られる
標準関数があれば教えてください。
それとも、こおゆう場合はmemchrで調べるのでしょうか?
>>790
ありません
792790:03/11/08 02:25
>>791
わかりました!!
793デフォルトの名無しさん:03/11/08 02:30
>>790
memchrとmemcmpを組み合わせる
794デフォルトの名無しさん:03/11/08 04:40
今構造体とファイル操作の練習プログラムを作っています、名簿管理的な。
それで、打ち込み形式で作った名簿ファイルを保存するまではうまくいったんです。
ファイルを読み込み、構造体にデータを入れる作業がわかりません・・・。
ものすごく初歩的な質問ですまそ
構造体の各要素にscanfとかで代入するコードを書く
796794:03/11/08 05:19
>>795
すいません、詳しく教えてもらえませんか?
保存できるんだったら、その逆をすればいいだけだと思うのだが。
798794:03/11/08 05:22
void peoplesave(struct people *y[], int num)
{
int i;

FILE *fp;
if((fp=fopen("db.txt","w"))==NULL){
printf("error!\n");
exit(1);
}

for (i=0; i<num; i++){
fprintf(fp," %s%5d %s%7.1f\n", y[i]->name, y[i]->age, y[i]->address,
y[i]->height);
}

fclose(fp);
}
コレが保存関数です、ハイ・・
799794:03/11/08 05:28
あ、ソース上げてしまった。すまんです・・
fscanf(fp," %s%5d %s%7.1f\n", y[i]->name, &(y[i]->age), y[i]->address,
&(y[i]->height));
読み込まんな。
height が double の場合は %f ではなく %lf で読み込むのじゃ。
fscanf(fp, "%s%d%s%lf", y[i]->name, &y[i]->age, y[i]->address, &y[i]->height);
fprintf の方は %f でいいんだけど。

fprintf で %s%d の間に明示的に空白入れないと
場合によっては表示がくっついて読み込みに失敗する場合があるので注意。
この場合年齢が 5 桁とか身長が 5 桁とか有り得ないと思うかもしれんが、
"%5d" を " %4" に、"%7.1f" を " %6.1f" に変えるだけだから別にケチる程の手間じゃない。
nameやaddressに空白が混じってなくて
ageやheightの前に空白がある(age4桁以内、height5桁以内)なら
単に("%s%d%s%lf", name, &age, address, &height)でいいやん。
%lfか%fかは知らんけど。
804794:03/11/08 06:02
保存されたファイルが、たとえば
aiueo 17 tokyo 176
oeuia 26 kyoto 168
みたいな感じに保存されてるんですが読み込めます?
どーもうまくいかんのです
構造体の定義を知りたい。
806794:03/11/08 06:09
>>805
struct people{
char name[20]; /* ローマ字による名前 */
int age; /* 年齢 */
char address[20]; /* 出身県名 */
float height; /* 身長 */
};

です
float なら %f だな。

fscanf(fp, "%s%d%s%f", y[i]->name, &y[i]->age, y[i]->address, &y[i]->height);

特に変なことはない気がするんだが...。
808794:03/11/08 06:26
y[i]の、[i]の値を取得できないんですよね・・
もともと入力するときに最初に記録する人数を指定して入力→保存
だったから、読み込むときに人数がわからない・・

コレが必死に考え付いたことなんですが解決策が思い浮かばず・・
つまづきました
scanfの戻り値を調べながらひたすら読み込め
事前に個数の判らないデータの読み込み:

  #define ALLOC_AUG 20

  struct people **y = 0;
  int num_alloc, num_valid;

  for (num_alloc=num_vaild=0; ! feof(fp); num_valid++) {
    if (num_valid >= num_alloc)
      y = (struct people **)realloc(y, (num_alloc += ALLOC_AUG) * sizeof(struct people *));
    y[num_valid] = malloc(sizeof(struct people));
    /* ここで読み込む */
  }
811810:03/11/08 07:20
いや待て。ここは宿題スレではなかったな。
>>810 は見なかったことにしてくれ。
812デフォルトの名無しさん :03/11/08 13:30
質問です。
C言語を覚えようと思うのですが
同じC言語でも色々な種類があるようです。
そのなかで、よく使われる言語(?)というのは何になるのでしょうか。
また、何かお勧めはありますか?
よろしくお願いします。
813デフォルトの名無しさん:03/11/08 13:37
-0ってどういうときにでちゃうんですか?
>>812
規格のことかな?
今は ANSI-C が主流だからそれを勉強してたら良いと思うよ。
そろそろ C99 も覚えておいた方が良いヲカン
816デフォルトの名無しさん:03/11/08 14:41
ANSI Cで十分よ
817デフォルトの名無しさん:03/11/08 14:49
C99の利点

for(int i=0;i<10;i++)

と書ける。もう今過ぎ使いたい感じ。イイェイ
818デフォルトの名無しさん:03/11/08 14:50
C++を使いましょう
>>816
ロートルはヌッコロス
820デフォルトの名無しさん:03/11/08 15:03
{int i=0;for (i=0; i < 10; i++) {
}}

ANSI C でいいじゃないか。
>>820
ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
822デフォルトの名無しさん :03/11/08 15:10
C++のデバックのやり方を教えてほしいです。
参考になるHPとかを教えてクリ。
>>821
for(i=0のi=0が余計だと言いたいのか?
824デフォルトの名無しさん:03/11/08 15:11
825デフォルトの名無しさん:03/11/08 15:12
{int i=0;for(;i<10;i++) {
}}

不要な代入文があったって、いいじゃないか( ´Д⊂
826デフォルトの名無しさん :03/11/08 15:17
>>814 816 818 820
早速のレスありがとうございます。
それから説明不足すみません。

DOSを使っていた頃はMSCをやっていたのですが
WINDOWSになってからはめっきりプログラミングをしなくなり
どういった状況になっているのか把握できていません。
ただ、VBやDELPHIよりもCをやったほうが良いというカキコが
あったのでCにチャレンジしてみたいなという動機なのです。

そこで色々な掲示板をみてみるとC++やC#
それからVISUALCなどいろいろあるようで
どの製品を購入すれば良いのか良くわからないのです。

あとANSI Cというのは規格でしょうか?
ひょっとして、それを覚えればどの製品でも開発は可能なのでしょうか?
自分の頭の限界が低いので、多分1つの言語を覚えるので精一杯だと
思うのです。

そこで1つ、何かお勧めの製品を探しているのですが
何を使えば良いのかよくわかりません。
皆さんはどんな製品を使っていますか?
827ヽ(´ー`)ノ:03/11/08 15:40
inline とか restrict とか使えるし、覚えておいて損はないと思うけどな。
compound literal も始めはキモかったが、慣れると便利なこともある。
>>820 のようなスコープの問題なんて、瑣末な事だと思ふ。

>>826
C++、C# は言語。C とは違うのでスレ違い。
ANSI C、C99 は C の規格。
正しい理解は正しい言葉から。これぐらいは Google でも調べれるから
一回、キチンと頭の中身を整理しる。
>>827
またあなたですか
>>794
#include <stdio.h>

typedef struct {
    char name[20];
    int age;
    char address[20];
    float height;
#define NMEMBER 4    // メンバーの数
} person;

#define MAX_PERSON 100    // 適当に変更
typedef person people[MAX_PERSON];

void open_input_file(FILE **ifp, char *filename);
void open_output_file(FILE **ofp, char *filename);
int close_input_file(FILE *ifp);
int close_output_file(FILE *ofp);

int load_people(people people_array, FILE *ifp);
int load_person(person *person_ptr, FILE *ifp);
int save_people(people people_array, int nperson, FILE *ofp);
int save_person(person *person_ptr, FILE *ofp);
830829:03/11/08 16:27
int main(void)
{
    FILE *ifp;
    FILE *ofp;
    char input_filename[] = "data.dat";
    people people_array;
    int nperson = 0;

    open_input_file(&ifp, input_filename);
    open_output_file(&ofp, NULL);

    nperson = load_people(people_array, ifp);
    fprintf(stderr, "%d %s loaded\n", nperson, nperson == 1 ? "person" : "people");

    nperson = save_people(people_array, nperson, ofp);
    fprintf(stderr, "%d %s saved\n", nperson, nperson == 1 ? "person" : "people");

    close_input_file(ifp);
    close_output_file(ofp);

    return 0;
}
831829:03/11/08 16:27
void open_input_file(FILE **ifp, char *filename)
{
    if (filename == NULL)
        *ifp = stdin;
    else
        *ifp = fopen(filename, "rt");
}

void open_output_file(FILE **ofp, char *filename)
{
    if (filename == NULL)
        *ofp = stdout;
    else
        *ofp = fopen(filename, "wt");
}

int close_input_file(FILE *ifp)
{
    return fclose(ifp);
}

int close_output_file(FILE *ofp)
{
    return fclose(ofp);
}
832829:03/11/08 16:29
int load_people(people people_array, FILE *ifp)
{
    int i;
    int loaded_person;

    for (i = 0, loaded_person = 0; i < MAX_PERSON; ++i)
        if (load_person(&(people_array[i]), ifp) == NMEMBER)
            ++loaded_person;
        else
            break;
        
    return loaded_person;
}

int load_person(person *person_ptr, FILE *ifp)
{
    return fscanf(ifp, "%s%d%s%f", person_ptr->name, &(person_ptr->age), person_ptr->address, &(person_ptr->height));
}
833829:03/11/08 16:29
int save_people(people people_array, int nperson, FILE *ofp)
{
    int i;
    int saved_person;

    for (i = 0, saved_person = 0; i < MAX_PERSON && i < nperson; ++i) {
        save_person(&(people_array[i]), ofp);
        ++saved_person;
    }

    return saved_person;
}

int save_person(person *person_ptr, FILE *ofp)
{
    return fprintf(ofp, "%s %d %s %f\n", person_ptr->name, person_ptr->age, person_ptr->address, person_ptr->height);
}
834829:03/11/08 16:33
data.dat の内容。

aiueo 17 tokyo 176
oeuia 26 kyoto 168



gcc version 3.2.3 (mingw special 20030504-1) で動作確認。
835デフォルトの名無しさん :03/11/08 17:51
>>827
返信ありがとうございます。
ANSI C やC99は規格なのですね。
☆ANSI Cは昔からありますよね(?)

827さんのおっしゃられるとおりで
私の気にしているのは、C言語を使うには何を買えば良いのかということです。
その点で、ここはC言語のスレなので特に問題はないかと思い
質問させていただきました。

解釈が間違ってたらごめんねなんやけど
たとえば、ANSI C準拠のCなら開発環境に依存せず
どのメーカーのコンパイラを通しても動作可能と認識して良いのでしょうか。

たとえば特定のコンパイラに依存する拡張命令があるとか
そういったことはないでしょうか。

その面で、きっと使いやすい、使いずらいなどの差が出るかな?
と思い、実際使用している方のアドバイスが欲しかったわけです。

もし同じ規格ならどのソフト(開発環境)を使っても問題ないなら
あとはソフトと自分との相性になりそうですね^^
836デフォルトの名無しさん:03/11/08 17:55
>>835
買う前に>>2を試そう
837デフォルトの名無しさん:03/11/08 17:58
>>835
> たとえば、ANSI C準拠のCなら開発環境に依存せず
> どのメーカーのコンパイラを通しても動作可能と認識して良いのでしょうか。

そうあるべきだけどそうとは限らない。
まあANSI Cなら大丈夫だと思うけど。
>>835
> どのメーカーのコンパイラを通しても動作可能と認識して良いのでしょうか。

strictly conformantなプログラムを書いていればね.
>>835 =826?

聞いた範囲で察するに、別にWindowsプログラムを憶えようってわけじゃないようだな。

BやDよりCをやった方がいいってのは俺も同意見だが、理由に気をつけた方がいい。
ちなみに俺がCを勧める理由は応用範囲の広さ(例えば組み込みなど)だったりする。
だが、これがあなたの価値観に必ずしも合うという自信はない。

何やら開発環境への依存に警戒しているようだが、そう、警戒するのはよい。
忘れちゃならんのは開発環境に依存しないということは、
それは裏を返せば開発環境のフルパワーを使い切らないということで、
はっきり言って勝負にならない。環境への依存を警戒するなら、
環境への依存から逃げ回るのではなく、色んな環境にどっぷり浸かって
マルチ対応になっておくのが現実的で前向きな対応だ。
^^^^^^^^

基本的に、物ちがうのに完全互換などありえない。
で、条件コンパイルするようになるわけだが、そこでマルチが出てくるわけだ。

どれか1つではなく、どれでも使えろ。
俺から言わせてもらうならこうだ。

手始めならVC/Borland/gccあたりか?
そうだな。 ついでに 言語からもマルチになっておけ
JAVA/Delphi/C#/VB/LISP みんなやれ。

プログラミングは人を楽にする為にいかに自分が苦労するかを楽しむもんだ。
841794:03/11/08 19:52
>>829-834
どうもありがとうございます。試してみます
842デフォルトの名無しさん:03/11/08 20:53
とりあえず質問だけどC言語ってどれぐらいで習得できるの?
>>842
とりあえずってレベルでいいんなら1週間もあれば。
とりあえずモチベーションによる。
とりあえず質問だけどC言語ってどれぐらいの間使わないと忘れるの?
とりあえずってレベルでいいんなら1週間もあれば。
とりあえずモチベーションによる。
モチベーションにもよるが、一週間程度で忘れてしまうのか(;´Д`)
日頃の鍛錬を欠かさんとこ
最低でも二重ポインタや構造体配列あたりまで使えんとまるで話にならんぞ。
あと分割コンパイルな。リンカわかってないやつ痛杉。
>>850==痛杉
>>850
はげどう
個人レベルで分割コンパイルって必要ある?
仕事したことないから分割コンパイルの利点が分からん。
>>852
ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
>>852
個人レベルだけど
ソースのサイズが1メガバイト越えるのが当たり前なので
分割しないとコンパイル時間が長すぎて駄目
855物凄く初心者:03/11/09 00:09
「0以上の整数n,kに対し、
組み合わせの数nCkを与える関数combination(n,k)を定義せよ」
が分かりません。
何方か教えてください。お願いします。
856852:03/11/09 00:09
そんなの個人じゃない!
>>855
ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
>>852
混じれ酢すると、
個人レベルでもいちいち全部をコンパイルするのが
面倒なくらいのサイズになることは多い。
あとは、機能ごとにファイルを分割しておけば
再利用したいときに便利だし、
ソースも読みやすくなる。
859852:03/11/09 00:28
>>858
分かりやすく解説してくれて有難う。
分割コンパイルだけじゃなくて、モジュール分割としての意味もあるんだね。
お陰でアソコもビンビンだよ。
モジュール化が一番の目的じゃネーノ?
ジャクソン法!
long i, j, x, y;
for (i = 0, x = 0; i < 1 << n; i++) {
for (j = i, y = 0; j > 0 && y <= k; j >>= 1)
if (j & 1) y++;
if (y = k) x++;
}
return x;
863物凄く初心者:03/11/09 00:40
>>862
ありがとうございます!
・・・って、これが他の方への回答だったら恥ずかしいけど。
質問なんですが、<<とか>>の意味は何ですか?
あとj&1も分からないです・・・。
暇な方がいたら教えてやってください。お願いします。
ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
( ゚д゚) ・・・
ヒソヒソ(´д)ヒソヒソ(´д`)ヒソヒソ(д`)ヒソヒソ
サリンサリン(´д)サリンサリン(´д`)サリンサリン(д`)サリンサリン
11/9は総選挙投票日
投票に行かない人は、カルトに入れたのと同じです
http://kanto.machi.to/tokyo/
(  д )


俺の陰口ばかり喋るなあああああああ!!!!!

871デフォルトの名無しさん:03/11/09 00:56
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c;
int b=0;
FILE *fp;
if( (fp = fopen("Readme.txt", "r")) == NULL){
printf("ファイルをオープンできません\n");
exit(0);
}
while ((c = fgetc(fp)) != -1){
printf("%d ", b);
putchar(c);
}
fclose(fp);
return 0;
}
上のソースをコンパイルすると日本語がうまく表示されませんしかし
872デフォルトの名無しさん:03/11/09 00:57
以下のようにwhile中のprintfを削除すると日本語も意の通りに表示されます。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c;
int b=0;
FILE *fp;
if( (fp = fopen("Readme.txt", "r")) == NULL){
printf("ファイルをオープンできません\n");
exit(0);
}
while ((c = fgetc(fp)) != -1){
//printf("%d ", b);
putchar(c);
}
fclose(fp);
return 0;
}
(・∀・)スンスンス-ン♪ ( ゚д゚)ハッ! (・∀・)スンスンス-ン♪ ( ゚д゚)イェー (・∀・)スンスンスンス
ウホホ(;´Д)ゲラゲラ(゚Д゚)アヒャヒャ(Д`)化化化化
>>871-872
stdoutをバッファリングなしに設定しろ
それと-1じゃなくてEOFと書け
>>871-872
日本語は 2 バイトなので、2度の fgetc → putchar を経てやっと正しく表示される。
>>871 では1バイト目(先行バイト)と2バイト目(後続バイト)の間に
printf が入ってるから正しく表示されない。
877875:03/11/09 01:00
ああ、そうじゃなくて、二バイト文字の間にprintfで出力するからだ
878デフォルトの名無しさん:03/11/09 01:00
なぜ、printfを削っただけで表示の仕方が変わるのか分かりません

ちなみにコンパイラはVC++.netです。お願いします。

ちなみにReadme.txt

abcdfあいうえお
>>871-872
main でなら exit(0); じゃなくて return 0; で終わったんで別にいいのでは。
880デフォルトの名無しさん:03/11/09 01:02
>>875-877さん
ありがとうございました。
>>878
おまえはすでに答えられている!!
882ピノン:03/11/09 01:03
お前ら明日はポポロクロイスですよ。
もまいら、ワラタw
884デフォルトの名無しさん:03/11/09 01:04
>>879
thanks
>>882
キャラクタは前作の方がなんとなく好きだ。
>>863
862は間違ってない?
>>886
何をいまさら。
888デフォルトの名無しさん:03/11/09 01:22
888
>>879
5.1.2.2.3 プログラム終了処理
main関数の最初の呼び出しからの復帰は,main関数が返す値を実引数としてもつexit関数の呼び出しと等価とする。
>>889
だから>>879はreturnでいいだろと言ったんだろ。
認めたくないものだな。自分自身の、若さゆえの過ちと言うものを・・・。
ヒソヒソ( ´Д)ガンヲタ?(´д`)ヒソヒソ(д` )
激臭のシャア
894デフォルトの名無しさん:03/11/09 02:11
macのXcode使ってる方いらっしゃいますか?
使い方がよくないのか分からないのですが、
hello worldすらビルドできなくて困ってます。
何か必要なこととかってあるんですかね?
895デフォルトの名無しさん:03/11/09 02:27
平方採中法のプログラムを教えて下さい。
数字を入力して、それを2乗した結果から、その結果の真ん中を
入力した数字の桁数をとってまた2乗するらしいです。
それを繰り返すらしいのですが・・・
わからないので教えて下さい。
あちこちで宿題房が大量発生してる・・・
>>895はマルチ
この流れは!!
はわわ〜
・・・こんな時間に悲しくないか?
ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
東鳩やったけどマルチが出る前に飽きてやめた。
ぱっと落としてやるかな。
C言語ってクソですか?
904デフォルトの名無しさん:03/11/09 09:26
( ゚Д゚)y−~~ お前らに秘儀を伝授してやる

char str[] = "?????????????????????";

int main()
{
int *ret;
ret = (int *)&ret + 2
*ret = str;
}

905デフォルトの名無しさん:03/11/09 13:00
すいません質問です。
double型ってあるじゃないですか、あれって2.22507e-308〜1.79769e+308まで表せれるじゃないですか。
なんで4バイトなのにこんなに表せれるんですか?int型は-2147483648〜2147483647までしか表せないのに・・。
構造がよく分りません、よろしくお願いします。
>>905
> double型ってあるじゃないですか、あれって2.22507e-308〜1.79769e+308まで表せれるじゃないですか。

そんなことはわからない。

> なんで4バイトなのにこんなに表せれるんですか?int型は-2147483648〜2147483647までしか表せないのに・・。
> 構造がよく分りません、よろしくお願いします。

浮動小数点 について調べろ。
907デフォルトの名無しさん:03/11/09 13:39
>>905
そもそもdouble型は
8バイトだ
>>907
君の処理系ではな。
>>905
指数部と仮数部の有効数字を合計してみそ
整数型と大差ないだろ
有効桁数ね 失礼した
911デフォルトの名無しさん:03/11/09 14:04
exp(-400)という感じの値を扱いたいのですが、たぶん桁落ちみたいな感じで変な値が表示されちゃいます。というか扱えていません。この場合、どのように処理すればいいのでしょうか?ちなみに下の割り算を行いたいです。マジでよろしこお願いします。
int main(void)
{
double A,B,C,D,a,b,c,d;
a=exp(-400);
b=exp(-399);
c=exp(-401);
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
d=a+b+c;
A=a/d;
B=b/d;
C=c/d;
D=a/(A+B+C);
printf("d=%lf\n",d);
printf("A=%lf\n",A);
printf("B=%lf\n",B);
printf("C=%lf\n",C);
return 0;
}
912911:03/11/09 14:06
↑%dは%lfにして下さい。すいません。
では、よろしこおねがいしますです。
913445:03/11/09 14:25
突然すみません、質問です。
/* poly.c */

#include <stdio.h>

#define N (4)

main()
{
float c[N], x, y;
int i;

for ( i = N-1; i >= 0; --i)
scanf("%f", &c[i]);

  for (x = 0.; x <= 1.; x += .1){
for (y = c[N-1], i = N-2; i >= 0; --i) y = y * x + c[i];
printf("%f %f\n", x, y);
 }
}

これはx=0 から1.0まで0・1 きざみで計算しfor文で計算を繰りかえしてるんですけど
これを参考にして、指数関数e^xの値 

 =1 + x/1! + x^2/2! + ・・・+ x^n-1/(n-1)!

と近似して、x = 0.0から2.0までの e^xの値を0.1刻みで多項式から計算して
表示するプログラムを作りたいんですが、次数を8次くらいまでにして作りたいんですが
色々試してるんですが全然分かりません。どうやればよいのか教えていただければ幸いです。よろしくお願いします
914835:03/11/09 14:44
>>837 839
C言語は、VBとかDELPHIとかと違って「これ」っていうのがないんのですね。
本屋さんに特定のC言語に関する本が極端に少ない理由もなんとなく飲み込めてきました。
そんななかで覚えていくというのは大変そうですね。
ごちゃごちゃになちゃいそう^^;

ともあれ、これ以上は実際にためしてみないとわからなさそうなので
教えていただいたVC/Borland/gccのなかで購入を検討してみます。
あと、何か簡単な本をさがしてみますね。

どうもありがとうございました。
イタタタタ・・・
>>915
だ、大丈夫か?
917905:03/11/09 14:54
>>907
すいません間違いです。floatと見てくれればいいです。
>>909
ありがとうございます。でもそれだったらdouble型は8バイトなんだからあってるのはおかしいんじゃないですか?
+eっていうのはどうしたんだっていうのも気になるし。
その辺のビットがどのように対応してるかとか分ります?
とゆーか初心者はこんなとこまでつっこまないほうがいいのかな・・・。
で、>>906 の最終行は無視かよ...。
919905:03/11/09 14:58
>>918
いや・・、これはもうすでに探してますけど、詳しく載ってるところがないです。
1234560000000000は1.23456*(10の10乗)と表すことができる
32バイトくらいほしいよね(o^-^o)
922911:03/11/09 17:48
マジで、マジで>>911をどなたかおねがいします。
お前にCはまだ無理だ
924デフォルトの名無しさん:03/11/09 18:04
基本情報に出題されているC言語はどの程度のレベルなんですか?
市販されている本の初級編辺りを理解出来ていれば解けますか?
今秋の午後は基礎しか出てなかったよ。
>>917

漏れの手元の処理系だと

4バイト数値型
#define FLT_MAX 3.402823466e+38F /* max value */
#define INT_MAX 2147483647 /* maximum (signed) int value */
float ・・・10+2=12桁
int ・・・10桁

8バイト整数型
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#define _I64_MAX 9223372036854775807i64
double ・・・17+3=20桁
__int64 ・・・19桁

だいたいあってるんじゃないか?

2進数の有限小数を10進数で表記したり
常用対数を小数点以下切り上げすると誤差が出る
927デフォルトの名無しさん:03/11/09 18:27
if(p) abort();
>>911
e を自然対数の底、"^"をべき乗とすると、

a = e^-400
b = e^-399
c = e^-401
d = a + b + c
 = e^-400 + e^-399 + e^-401

A = a / d
 = e^-400 / (e^-400 + e^-399 + e^-401)
 = 1 / (1 + e^-1 + e)

以下同様。ただし、D の精度はたぶんどうしようもない。
CってOSもつくれちゃうんだよね(*^^*)
         v――.、
      /  !     \
       /   ,イ      ヽ
     /  _,,,ノ !)ノリハ    i                                        
    i  jr三ミ__r;三ミ_   ヽ     
    l  ,iヾ二ノ ヽ二 ハ   ノ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ヽ、.l  ,.r、_,っ、  !_,    <  >>1 糞スレ立てんな、蛆虫、氏ね。
       !  rrrrrrrァi! L.     \______________
       ゝ、^'ー=~''"' ;,∧入
   ,r‐‐'"/ >、__,r‐ツ./   ヽ_
  /  /  i" i, ..:  /  /  ヽ-、   
 ./  ヽ> l    /   i     \
探偵ナイトスクープ見てからケツからミミズが出てくる悪夢にうなされる・・・
>>919
ほんとに調べたのか ?
もしそうなら、Google も使えないような奴はこの業界向いてないからあきらめることを推奨する。
933デフォルトの名無しさん:03/11/09 20:57
typedef struct hoge{
char *foo1;
char *foo2;
}hoge;
と構造体を定義して、
hoge->foo1="hello";
hoge->foo2="bye";
とすると、
prinft("%s\n",hoge->foo1);
printf("%s\n",hoge->foo2);
両方同じ"bye"と表示されてしいます。
そもそも、foo1とfoo2も同じアドレスになっているのですが、なぜでしょうか?
934デフォルトの名無しさん:03/11/09 20:59
>>933
それ以前にhogeは型で変数じゃないと思うんだが
>>932
またお前か
>>933
コンパイルエラー多発するソースを挙げんな
typedefは型をでぃふぁいんするもの
でぃふぃにしょん
939デフォルトの名無しさん:03/11/09 23:41
>>933
> prinft("%s\n",hoge->foo1);

推敲を省略する奴の発言は見るだけ時間の無駄
ぷりんふと
>>939
突っ込むべきところはそこか?そこなのか?
void prinft(const char *a,char *b)
{
printf("bye");
}

なるほど。こういう落ちか。
943942:03/11/10 00:06
> そもそも、foo1とfoo2も同じアドレスになっているのですが

違うか
#define struct union
>>933
hogeは型名だしなあ

型名 -> メンバ

こんな表記はとおらないよな
>>911
やってみたけど、別に変な結果にならんのだが...。
exp(-400) 程度なら 大体 10 の 174 乗程度のオーダーだし、
足し算も同程度のオーダーの値同士でやってるし、
割り算の結果も余裕で double で扱える範囲だし、
桁落ちするとは思えない。
C言語むかつく。
数学の知識要らないとかいろんなとこでみたので 安心して
入門書買ったら・・・・・・・・・・死のう・・・・・・・・
>>947
全くいらない訳じゃないが、
そんなに多くの知識も要らないと思うが?
算数は分からないと駄目ですよ。
950デフォルトの名無しさん:03/11/10 11:28


・うるう年の条件
「年が4で割り切れる年はうるう年だが100で割り切れる場合はうるう年ではない、そして400で割り切れる年はそれらとは無関係にうるう年」


↑みなさまはこれをすぐに条件式にできますか?
自分はできませんでした。
できます
「すぐに」を正確に定義してください。
じゃあちょっとだけ条件式の書き方を解説
まずorから攻めよ。
こういうときに条件を満たすってのをorで結んでいけばいいの。
この場合はまず (....) || (400で割り切れる)
次に制約、制限をandで結ぶ。
(4で割り切れる) && !(100で割り切れる)
これであってるよね・・・?

orが基本になるのです。
真になる条件を全部書き出してorで結ぶって方法もある。
使ったことないけど・・・・
954950:03/11/10 12:32

>まずorから攻めよ。

入門書の68ページ目を理解するのになんでそんなわけの分からん決まりごとを知っておかねばならんのだ?
自分で考える力が無いからそういう法則みたいなのにのに頼るんだろ?( ´゚c_,゚` )プッ
しょせん中卒の俺と同レベルw
むしろ当たり前のように反則技使うお前らよりは俺の方が素質は上だろうwww確実にw
てst
もう冬休みか?
>>954
構って欲しいなら、もう少し別のアプローチを選択した方がいい。

>>950
>みなさまはこれをすぐに条件式にできますか?
できるよ。つか、各条件が独立してるから
これは解り易い方だろ。

まず条件として
 [A] 4で割り切れるかどうか
 [B] 100で割り切れるかどうか
 [C] 400 で割り切れるかどうか
の3つがあることが判れば、あとは

  閏年かどうか = ([A] && ! [BB]) || [C]

となる。Cだと

  ! year%4 && year%100 || ! year%400

どーしても判らんかったら、フラグ用意してひとつづつ
判定汁。

char leaped = 0;
if (year % 4 == 0)
  leaped = 1;
if (year % 100 == 0)
  leaped = 0;
if (year % 400 == 0)
  leaped = 1;
ついでに。
もっと複雑な条件のときは真理値表を書いた方がいいだろう。
/* 元の条件が整理できるし、矛盾があればその時点で把握できる。 */
この例だと、

[A] [B] [C] 結果
 F  F  F  F
 F  F  T  T
 F  T  F  F
 F  T  T  T
 T  F  F  T
 T  F  T  T
 T  T  F  F
 T  T  T  T

結果が T になるのは

[A] [B] [C] 結果
 F  -  T  T
 T  F  -  T
 T  T  T  T

![A] && [C]、つまり
 「4で割り切れないのに400で割り切れる」
はありえないので除外すると、結局上のと同じになる。

つーかこれ、スレ違い気味だな。
自前のうるう年判定なんかやるから2000年問題がおきたんだよ
2000年問題と2000年2月29日問題は別なのだが
>>960
ネタはマ板で
>>963
クソレスはム板で
厨房死ね
C言語を習い始めてアプリケーションを作れるようになるには何日くらい必要ですか?
967911:03/11/10 19:06
3週間くらいじゃない?
次スレは?
次スレ

C統合・質問スレッド
http://pc2.2ch.net/test/read.cgi/tech/1068359871/
質問します。
配列を定義すると、要素がはじめから0になってるんですけど
明示的に0で初期化した方がよいんでしょうか?
する必要ないですか?
>>972
記憶クラスがstaticである変数(グローバル変数・ローカルなstatic変数)は
0で初期化される。
それ以外は保障されていない
わかりました。ありがとうごさいます。
自動変数でも、

 int a[10] = { 0 };

としただけで、全部 0 で初期化される。
ぞれは明示的に初期化していると言わないだろーか
WAVEファイルをfopenで"r"やら"rb"やらで開くと文字化けしたような結果になりますが、
「RIFF 01 11・・・・」
みたいなキレイな結果が返ってくるにはどうしたらいいのでしょう・・・?
>>977
WAVEファイルのフォーマット知ってるのか?
俺は知らんからとりあえず「RIFF 01 11・・・・」
を期待する部分を16進数で表示した結果を晒せ
>>976
a[0] は明示的に初期化してるけど、
他は暗黙に初期化してる。
>>977
fread で読んでるか?
>>977
まさか、プレーンテキストで返ってくる事を期待してないよな?
982デフォルトの名無しさん:03/11/14 13:02
>>977みたいな処理って、バイトを2進数を表す文字や16進数を表す文字に直さないとダメじゃないの?
>>982
その理由を聞きたい。
984デフォルトの名無しさん:03/11/14 18:29
>>983
だって、つまりファイルダンプしたいってことでしょ?
バイナリファイルを2進数や16進数の文字で表す場合
それしか方法ないと思うけど
>>983
釣るな
>>984
釣られるな
986デフォルトの名無しさん:03/11/14 19:12

    _____
    |キャンセル|
     ̄ ̄ ̄ ̄ ̄
>>977
一度,バイナリエディタという類のソフトを使ってみるといい。
16進ダンプとASCII(モノによってはUNICODEなども)は別々に表示される。

これは,ASCII文字とバイナリデータを区別する手段が無いため。
おまいも別々に表示しろ!
今日はじめてCやってみたけど、窓開けられねー
989パスカルの三角形がわかりません。:03/11/14 22:10
UNIXのC言語なんですけど数字を入力したら↓みたいになるプログラムがわかりません

   *
  * *
 * * *
* * * *
あと負の数字を入れたらこうなります。
−4
* * * *
 * * * 
  * *
   *
よろしくお願いします。
マルチ、止めれ。
マルチ氏ね
埋め立てなら私に聞け!
****
***
**
*
**
*
maruti
****
***
**
*
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。