60 :
デフォルトの名無しさん :
03/10/21 00:29 構造体の先頭アドレスを引数にすることは良くない様なハナシを聞きました。 なにがイケナイのでしょうか? アライメント、ポインタがキーワードみたいですが。。。 ちなみに構造体のアライメントについては理解しています。 ポインタとからむと不都合が生じるのでしょうか? 知ってる方教えてくださいな! ここ見れ!とサイトを記載してもらっても結構です。 よろしくね!
単発質問でスレ立てるような奴は氏んで良いよ。
63 :
デフォルトの名無しさん :03/10/21 02:01
>>60 バイト境界を意識しながら
構造体にパディアン入れていけ。
そして遠慮なく使え。
なるほど!よく分かりません。。。
>>64 アフォは出力されたアセンブラのソース見て研究しろ。
これだからJava厨は嫌なんだよ。
マルチポスト死ね
アホだな。というか、構造体のポインタ使っちゃいけないなんて ちょー昔にちょこっとだけ見かけたことがあるくらいだが、いまだに そんなの信じてやってるやつとかいるのかなぁ。 C++なら参照渡しがあるが、C時代では関数に構造体事態を引数に 渡すのが安全というのがあったが・・・。スタックフローのほうが怖いわ。
つまり現代では(?)、構造体の先頭アドレスを引数にしても良い。 という事デスカ?
アホすぎ・・・
昔っからそうだよ
>>68 てかあなたはサンプルとか(適当なOSの)APIやライブラリの説明とか読んだことありますか?
たとえば fprintf なんかでも普通に構造体のアドレスをパラメータにしてるでしょ?
言われてみれば確かにその通りですねぇ。。。
いや、なんかで構造体のまま渡した方が間違いがないという記述を見たことがあるぞ。 サンプルコードレベルならどっちでもいいんだろうが・・・。
>>72 つーかよほどの必要性がない限り構造体渡しなんて氏ねェよ。
スタックオーバーフローするかもしれんし、コピーする分性能ロスがあるじゃねぇか。
アセンブラコード比較すれば一目瞭然。こんなんでポインタ操作間違えるようなコンパイラは
逝ってしまえ。
C++なら参照渡し、Cならポインタ渡しだろ。
値を受け取る目的で参照渡しするやつはゴミ。
60のがせネタのソースはどこだよ。
ソースは人の会話です。 私が作成したCソースで構造体の先頭アドレスを引数にしているのを見たA氏曰く、 A氏「構造体の先頭アドレス渡してる!」 B氏「あちゃー!それやるとポインタで…(以下聞き取り不能でした)」 私はその会話をちょっと離れたところで聞いて、「???」となったという次第です。
>>79 ローカル変数の構造体のポインタを渡してその関数内でリストに
格納とかしてないければいいんだよ
あとは問題なし。
(60 が「構造体のアドレス」ではなく、「構造体の先頭アドレス」と書いているのが 微妙に気になるのは漏れだけ?)
じつは構造体の先頭ではなく後ろのアドレスを渡さなければいけない関数だった
実体のない構造体のポインタだけを宣言して、値を返してもらうための関数に 渡してんじゃない? それだとすれば、A氏、B氏の言葉が説明つくだろ。
FILE* みたいに専用のアロケーション関数で得たポインタしか許可しない関数に、 FILE fp; fprintf(&fp...); みたいなことしてる、という可能性もあるか?
あとはプロセス境界を越える IPC とか、シリアライズが必要な場面とかで、 ポインタを使っているとか。
構造体そのものを返す関数といえばdivやldivくらいしか思い浮かばないし、渡す関数は何も思い浮かばないなぁ。
別プロセスやマルチスレッドでの制御なら、ポインタ渡しはまずそうだな。
>>74 やっていいとはいってないよ。15年くらい前にそういうこといってるアホが
いたっつー話。
>>87 あとはRPCとかCORBAとか使うときか。
でも、Cを多少使えたらメモリがどこにアロケートされるかくらいわかるだろ。
typedef struct _POINT { WORD x; WORD y; } POINT; 程度のものなんかは値渡しする API が結構ある。Win32 でも MacOS でも。
ざっくり考え方を変えて、たとえば sscanf に何かの構造体のアドレスを 渡してた、なんてのはどうだろう。。。
91 :
デフォルトの名無しさん :03/10/21 04:56
age
てかそれ、今調べたらファイルポインタ用ですね・・・
A氏とB氏が見たソースを見せてもらえれば、何かわかるかもしれませんね。
95 :
デフォルトの名無しさん :03/10/21 09:13
ちょっと質問。 今まで int i=0,j=i; みたいなコード結構書いてきたんですけど これでjは必ず0がになってるんでしょうか?
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
いろんなヘッダで定義されていれば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型の話なんかしていないぞ。
>>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 でやっても、他の何かが(ゴミ)入ってるので区別つかないのです
>>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);
ありあとうございます すぐにやってみます
できました 感謝します
>>121 例を挙げる程度なら,そっちのが分かりやすいだろ?
>>127 NO!
ここで聞くような初心者は、まるコピしてエラーに会う可能性有り。
むしろ宣言しないほうが良い。
どっかで int i;ってあるんだろうなって思わせたほうが良いのでは?
初心者はC99対応の処理系を使うべきだな。
>>130 そして C++ に移行できなくなるわけだな。
132 :
デフォルトの名無しさん :03/10/21 20:23
文字列を入力として受け付けて、その文字列中に含まれる数字の合 値を求めてみてください。 例: a1b23g4 と入力された場合、1+2+3+4 で10 を出力してみせてください。
できました
134 :
デフォルトの名無しさん :03/10/21 20:42
>>129 そりゃそうだろ。俺が説明するために引っ張り出した例だし。
(配列,インデックス)
の組み合わせでアクセスするより
(先頭ポインタ,現在のポインタ)
(末尾ポインタ,現在のポインタ)
なんかの組み合わせでアクセスする方が効率的な場合があるってことをな。
>>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 いやだからですね、
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
>>150 ># と言うか、元の状態を保存せずに元に戻すなんて出来るわけがないだろ?
いやだからそれを含めて聞いたわけです
「そういう関数(用意されて)ないですか?」ってね
いままで他言語(Python7年)やってて
初めてC言語やるので、いろいろやり方が違うので戸惑っています
例えば、ある関数内のテンポラリポインタは返せないので
(void*)get((void*)dest)
と言う具合に、いわゆる入れ物みたいな物を渡さないといけない
この入れ物渡すっていうやり方がどうも最初の頃思いつかず
全てを同じ関数内(main)に書いてました、あるいは広域変数とか使って・・・
152 :
デフォルトの名無しさん :03/10/22 01:24
ぶっちゃけ、ヒープ領域に確保した先頭アドレスは常に保持しておくのは定石じゃろ。 確保したデータ内の特定の数値にアクセスしたいなら 配列を使ってアクセスするか 参照用のポインタにアドレスをコピーして、ポインタを使ってアクセスするもんだろ。
153 :
デフォルトの名無しさん :03/10/22 01:34
c言語から、カレントディレクトリの移動とかって、 どうするんですか?
>>153 環境依存だ。
でも、まぁ、だいたい想像どおりの名前の関数が用意されているはず。
ええ〜?
GCかけて放置する手もあるが。
ぶっちゃけpython7年なんて人はじめて見た。
邪道の邪はjavaのja。
よこしまな道
161 :
デフォルトの名無しさん :03/10/22 02:03
非道の非は、C#の#
163 :
デフォルトの名無しさん :03/10/22 02:09
C++なんかには負けないもん
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つのオブジェクトで
状態を持つことは十分にありうる
>>170 突っ込まれて後から言い訳してるアフォを基準に
邪悪なものとしている、なんて決め付けないでくれよ…。
>>173 実際にそういう風潮はあるだろ。俺は同意できないけど。
>>170 の言うとおり
CにしろC++にしろ
イベントを受け取る関数内で
どうしようもなくグローバル使わなきゃいけない時がある
これはどうにかすべき
>>151 >いままで他言語(Python7年)やってて
どんな言語でも、何らかの状態を戻すためにはその状態を保存しておくだろ?
おまいはホントにプログラム経験があるのか?と(ry
>>152 >ぶっちゃけ、ヒープ領域に確保した先頭アドレスは常に保持しておくのは定石じゃろ。
なので、そういう『定石』みたいな物を知りたかったと言う事もあって質問しました
自分で独学していて「果たしてこんなやり方でいいのか?」と疑問に思ったのです
しかもC言語って非常に低い階層のレベルでプログラミングするので
関数とかが非常に込み入ったものになります
ループも何個も入れ子になったりして・・・
ホントにこれでいいのか?と悩むわけです
(私自身Pythonのインデントの方でそういうのは慣れてますが・・・)
処理のロジック自体も、さまざまな(大げさに言えば)アルゴリズムがあって
「なにしてんだ?こんなことやらずに素直にやればいいのに」と思われるようなトリック的な方法とかも有ります
今まで私がやってきた言語の多くは効率よりも再利用性(ある意味わかりやすく書くことでもある)を最大限に引き出す形でしたし
また、そういった細かいことをやるのはあまりいい目で見られませんでした
>>157 ええ、多分私ぐらいですよねそんなの
しかも、Cを知らないなんて非常に稀かも・・・(もちろん全く知らなかったわけではありませんが)
私は海外組で、Pythonの需要は結構ありました
でもまあPythonって結構皆さんの知らないところでの活躍が多いかと思います
たとえばPythonで、あるOSのインストーラとかにも関わったことあります
アメリカでの話ですが一時期、学生にはJavaよりもPythonの方が人気がありました
>>177 >関数とかが非常に込み入ったものになります
>ループも何個も入れ子になったりして・・・
それは藻前の設計がタコだからだろ?
「ポインタを進める」という表現から巻き戻せると思ったのかもしれないけど、やっていることは上書きだ。 元の値かいくつ進めたかという情報をどこかに保存しておかないと元には戻せない。
sizeofを使うとそれっぽいことはできるんだが
どうやって?
forで *p++ = *q++; していくわけだろ その後、qを戻したいだけなら q = q - sizeof(q); すればいいんでは無いかと
>>184 qがchar *として、sizeof(char *)が4だとしたら、4つ戻すということになるけど。一体なんの意味が?
熱があるようだな、うわ言を言っている。
すまん、なんかくるっとった
本日の名言 入選:その後、qを戻したいだけなら q = q - sizeof(q); すればいいんでは無いかと 佳作:sizeof(char *)が4だとしたら、4つ戻すということになるけど。
まぁ要するに こういう風にしたかったわけだが、普通に確保しといた方が楽だ 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++)
すまん、途中でおくってしまった。
つうか、普通にex1入れりゃいいじゃん・・・ もうだめぽ
>>192 sizeof(q)じゃintではなくint *の大きさを返すが、いいんだろうか・・・・
pのsizeによってはアライアメントの問題でだめぽの予感
ここはおもしろいC言語ですね…
>176 GCは状態を戻せるけど、状態は保存されてたっけか?
GCでなんの状態が戻ってるんだ? 詳細キボンヌ。
メモリが確保されている状態->解放されている/確保されていない状態
戻ってないやん。
初歩的な質問で申し訳ないです。 *.a ---→ 実行ファイル生成時にリンクされる lib*.so.* ---→ アプリケーション実行時、若しくはdlopenによって必要な時にリンク(?)される って見解なんですが、lib*.la って何に使われるんでしょうか?
204 :
デフォルトの名無しさん :03/10/22 22:17
205 :
デフォルトの名無しさん :03/10/22 23:57
実は意外とマジレスだったりして(w
上のやりとり、ちょっとなごんだよ。 微笑ましくていい。
やれやれ、アホ扱いか。 普通変数といえばC言語ではグローバル変数を 示すことがほとんどだとは知らなかったよ。
>>207 変数と言えばローカル・グローバルのどちらもあり得る
みんな、もうそろそろグローバル変数なんて捨てようよ。
210 :
デフォルトの名無しさん :03/10/23 01:06
>>209 GNU系のソースからなくなったら考えるよ。
211 :
デフォルトの名無しさん :03/10/23 01:09
>>204 マジレスすると・・・・・
なんだっけ?
はい!次の質問どうぞ。
もうそろそろグローバル関数なんて捨てようよ
グローバルな視野を持て。 -クラーク先生-
もうそろそろC++に移行しようよ
>>215 道具は使いよう。つーかCがなきゃG++もメイクできないじゃん。
アホか。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" として、これを返値として、スクリプトの方でバラすぐらいしか思いつきません…。
>>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つの値を返してもらう方法ってありますか。
後から見ると、かなり文章が変ですね。すみません。
構造体にして、アドレス返せば?
ポインタを使うのですか。
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}; }
#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));}
246 :
デフォルトの名無しさん :03/10/23 21:00
>>242 コアダンプだあ? 氏ね、ホラ吹き野郎!
>>243 structだけじゃ定義したことにはならない?
代入しなきゃだめでしょ。
コンパイル時にif文の前辺りに "return makes pointer from integer without a cast" という警告があったけど、 どう修正したらいいんだろう
>>249 キャストする(ただし型がそれで正しければね)
どこを型変換すればいい?
gethostbynameの返り値の型はなんだ?
>>252 BSD4.3の規格なら struct hostent* のはず。
char型
もうソース全部捨てて糞して寝てろ。
>>254 なんか変だな環境は何?
BSDやGlibcだと多分こんな感じ。
struct hostent *gethostbyname(const char *name);
>>256 のようにやったらhostがundeclaredした
>>257 ?君はちゃんと宣言してると思ったが・・・。
>> struct hostent *host;
なんでundecleard??
いつの間にか「俺」から「私」になってる。。。
最初は「オレ」だった
Cプログラムからシステムコールで MozillaにURIを読み込ませたいのですが(起動でなく更新)、 ググってもなかなか見つかりません。 環境はVineLinuxです。
fork() で -1(エラー)が帰ってくる理由は?
>>265 EAGAIN
親プロセスのページ・テーブルのコピーと 子プロセスのタスク構造に生成に必要なメモリを fork が割り当てることができなかった。
ENOMEM
メモリが足りないために、 fork は必要なカーネル構造体を割り当てることができなかった。
267 :
デフォルトの名無しさん :03/10/24 03:09
>>266 EAGAIN と ENOMEM 2つ原因が考えられるということですね。
>>268 人の書き込みを鵜呑みじゃなく、使ってる環境でmanしろということだ。
>>267 > 上記を逸した場合の結果は激しく未定義だYO!
多分これだろ。
なにを言っているんだ。 > 標準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; } …続く
以下のエラーが出てしまいます。 「プロジェクト project2_302.exeがEAccessViolationクラスの生成をしました。'アドレス 32566645でアド レス F85D8A60に対する読みこみ違反が起きました。'プロセスは停止しています。再開するにはステップ実行 または実行を選択してください。」 他スレで聞いたところ、 開けた時にエラー処理、開けなかった時に処理続行になってますよ。 それと、"r"で開く時は既にファイルが存在していないとファイルオープン失敗ます。 無効なファイルポインタ使ってアクセスしてエラー起こしてる悪寒 と、いうレスを頂いたのですが、もうちょっと詳しくアドバイス願えないでしょうか。
>>272 if(fpa=fopen(afname,"r")){
printf("ファイル;%sがオープンできません\n",afname);
オープンできた場合にこう表示されるがいいのか?
では、複写元ファイルを開く構文で、 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
リストの場合はそういう関数作れ。
お二人ともレスありがとうございます。
>>279 そうなんですか。では今のままの方が良さそうですね。
>>281 配列の場合なのですが、うーん、すいません
ちょっとどういう事なのかが良く…単に+=6では駄目ですよねぇ。
>281が何を言いたいのかは正直オレもわからんw
配列からはみ出た場合を考える
285 :
デフォルトの名無しさん :03/10/24 11:02
>>286 すまぬこっちも仕事やってるから、いいかげんな投稿だった・・・。
今日は煽るだけの厨房はいないの?
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で出力されるはず。
>>291 と私も今まで思っていたのですが、先ほど
Borland C++ Builder 6.0
でコンパイルしたら、見事に型変換されていませんでした。
これはもともと規格上未定義なのか、コンパイラのバグなのか
知りたかったので・・・
>>292 どんな感じになるの?
つーか今の環境はC++ Builder入ってないです
Delphiならあるけど
>>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に格上げされる。
どうして290のような疑問がうまれるのか興味ある。
> mov al,[ebp-0x01] ここでしてると思われ。al(8bit) → (32bit)
302 :
デフォルトの名無しさん :03/10/24 14:33
>>295 ちょっとやってみます。
>>296 mov al,[ebp-0x01]
で a の値を al に代入していますが、その後すぐに
push eax
では EAX の上位のデータはどうなっているか分かりません。
(不明なデータがスタックに積まれている)
>>297 本当?
こんな下らんレスに偽者が出るとは。
>>298
294のコードって、Partial Register Stall食らわない? それとも、省略されているところでなんとかなってたりするの?
偽者か(^_^;) そういえばあれだけsageとるな。
>>302 本当 ちなみにfloatはdoubleに格上げされる(printfでfloatもdoubleも%fなのはそのため)
>>299 以前に別のコンパイラを使用して作成していたコードを
今回 Borland C ++ 6.0 を使用して再コンパイルした所、
printf() で奇妙な値が出力されたので、原因を調べていたら
たまたまこんなことを発見したのです。
>>305 Borlandか・・・やってみたいけど持っていないから無理だな。
もしかしてenumは整数型とみなされていないのか・・・・?
>>295 やってみましたがアセンブラの出力は変わりませんでした。
>>305 そのときもコンパイルオプションでcharと同じ大きさにするようにしていたの?
ALより上のEAXのビットによって出力される値が変わるってこと?
>>308 すまぬGCCの出力と比べてるけどそもそもMASMの文法はよくわからんので。
それで実行するともちろんデタラメだったら
>>302 が正しいかも。
>>310 >>300 が違ってるとそうなるのかなぁ。
EAXは返り値として使ってるはずだから printfの前に上位ビットを埋めるたのを返す関数を書いてみたら?
>>300 は間違い。
>>302 がただしい。
相手コンピュータなんだから「かも」とか、そういう問題ではない。
>>308 実際に動作させた結果も変なの?もともと EAX の上位24bit はゼロで、
それを利用してのそういうコードが出ている、というわけじゃあなくて?
手元のbcc 5.6.4だとちゃんとしたコードを吐くな。 まず、aに代入する以前にeaxにE1を代入して、それから[esp]にalを入れてる。 そして、そのままeaxをprintfに渡してる。
eaxに代入してるのは符号拡張した値ね。
319 :
デフォルトの名無しさん :03/10/24 15:05
その疑わしきプログラムをうpしる! もちろんコンパイルしたものを。
320 :
デフォルトの名無しさん :03/10/24 15:06
偽者がウィルスでもアップしたらまずいか。。。
321 :
デフォルトの名無しさん :03/10/24 15:18
結論はバグということでいいのか?
>>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
お、確かに2つ使ったらおかしくなった。 普段使わないオプションだから気づかなかったけど、バグだね。 (BCB6+UPDATE4)
ゴミ?>9382401
とりあえずバグなんだな。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かませばいいじゃん
>>334 ありがとうございました。できました。
ちなみに、-'0'はどーゆー意味があるのでしょうか??
>>335 いや、かませるならそうしたかったのですが、できなかったので。。
>>327 ポケコンでCを使えるのがあったような・・・
>>331 書き込んだあとに気づいたよ。
wanderswanって書いてあったからGBA書きたくなって。
漏れもブートケーブル持ってるが自作プログラムは転送したこと無い。
でもガンガってる。つもり。
devkitadv + GBAエミュ はフリーなGUIプログラム製作環境です。
とか言ってみるテスト。
wonder
遅レスですが、みなさんのおかげで先に進みました。感謝。
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");
ダウンロードしてきた 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");
>>354 sprintf(buf,"D:\\hage\\%s",fname);じゃダメなの?
357 :
デフォルトの名無しさん :03/10/26 13:25
禿げって言うな!
358 :
デフォルトの名無しさん :03/10/26 13:33
若禿はツラいんだろうな
>356 表現が中途半端でしたね const char *dir = "D:\\hage\\"; sprintf(buf,"%s%s"dir,,fname); ようするにディレクトリも別の箇所で自由に指定可能、と
質問です。 sendto()とsendmsg()の違いが分かりません。相異点として 前者が単一バッファで、後者がスキャッタ/ギャザーらしいことは 調べました。しかし、意味も使い分けも分かりません。 やりたいことは、UDPデータグラムを送ることなのですが、 どういうときにどちらを使えばいいのですか?
363 :
デフォルトの名無しさん :03/10/26 21:37
>>362 とりあえず死んだ気になって全剃りしてみたら?
ボーランドとビジュアルC ってどっちが、とっつき安いの?
367 :
デフォルトの名無しさん :03/10/27 00:01
超初心者ですがgccでなんとかなってますよ
368 :
デフォルトの名無しさん :03/10/27 00:34
後々は統合開発環境を使うとしても、 ちゃんとしたカリキュラムなら先に make を使わせるだろな。
質問でつ コマンドhogeを作っているんですが・・ % hoge | moge と $ hoge > moge と % hoge の判別をしたいのですが、なにかAPIとかあるんでしょうか? ちなみに環境はCYGWINです。
>>370 なにが目的で判別したいのかわかんないけど、とりあえず fstat
>>370 なにが目的で判別したいのかわかんないけど、とりあえず スレ違い
ファイル読み込みに関する質問です。 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%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言語にそんな仕様はないが、ヒントはショートファイル名。
128
>>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;
つづきです。 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 2chではTAB文字が消されるようになった
>>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;
}
}
個数が静的に定まっていない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]);
}
400 :
デフォルトの名無しさん :03/10/28 18:28
さらしage
>>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を非難しているのではない、こいつに変なこと吹き込んだ連中を揶揄している)
>>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 インデックス)を頂けませんか?
test
ポインタ絡みじゃないの?
>>406 cの言語仕様やプログラムの意味は、実行時のメモリモデルをもとに考えると
理解しやすい。
具体的には、様々な基本型、配列、構造体、共用体のデータについて、メモリ上で
どういうレイアウトで表現されるかを考えてみるのがいいのでは。
参考書としては『Cプログラミング専門課程』が、個人的に分かりやすかった。
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
非XWindowsって
420 :
デフォルトの名無しさん :03/10/29 16:56
Cでは変数に$を付けないのはなんでですか?
は?
423 :
デフォルトの名無しさん :03/10/29 17:15
Cに連想配列はないのですか?
424 :
デフォルトの名無しさん :03/10/29 17:38
#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); }
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 それ おなじじゃないと動かないソフト ざくざく(笑)
ポインタ は 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 } 初歩的なこと聞いてすみません
>>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行づつ書くほうが分かりやすいぞ。
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; }
スマソ ↑の結果表示を訂正する。 printf ("\n入力数は〜
/*この方が良いか?*/ #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言語ですか?
どうもありがとうございました
>入力正整数の総和 ああ、良く読んでなかった。 ハイ、バカです俺。初心者です。 if (scanf("%d",&input)<0)
>>457 初心者だと思うのなら、せめて実行確認してはどうか。
> if (scanf("%d",&input)<0)
ここにいる香具師ってさあC++もできるわけ? できるなら。Cの文法だいたいわかってるやつが++わかるのに どれくらいかかるか漏れは知りたい。
>>459 C++スレで聞いたほうが良い。
ここは++の話をするだけで怒るヤシが居るから。
Cでそれなりのプログラム書いてる香具師なら、 禿本に書いてあることにまあたいていは頷けるようになっているはず。 KRもそうだが初版のほうが簡潔でわかりやすい。 金と時間はかかるが初版→2版→3版→ISOと読み進むことをすすめたい。 なぜなら禿自身と同じ習得パスを通れるからだ。
ふーん・・・・。もう寝るわ。 お(^o^=) や(o^O^) す(^。^o) みー!(o^-^)ヾ
466 :
デフォルトの名無しさん :03/10/30 23:04
>>459 なんだそれ。
そんなもんピンキリだろ。
すごく簡単な質問なんですが、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"); はできてたのか?
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 構造体には詰め物が入るかもしれないぞ。
488 :
デフォルトの名無しさん :03/11/01 11:43
オープンソースのソフトとかで、gccとかcl.exeとかのCUIのコンパイラ でメークファイルを書いてる人たちは、どういう風にデバッグしてるんですか? まさか printf埋め込んだりしてるんですか?
ひとそれぞれ。
490 :
デフォルトの名無しさん :03/11/01 12:26
>>482 どんな変数でも良いから,(struct A*)へキャストしてしまえ。
((struct A*)main) とかな。
>>491 「どんな変数でも」は間違いだろ。ポインタにキャストできるものならなんでも。
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言語に変換してプログラミング するってどのようにすればいいのですか?
出直せ。
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; }
解りにくすぎるので補足します。 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] とするか。
>>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 自分の処理系ではどうのと調べてから質問してみたんですが
なんか差し支えがありましたか?
駄洒落だろ
(´Д`υ)
523 :
デフォルトの名無しさん :03/11/02 01:35
p[i]のpとiが交換可能なのは*(p+i)と等価だから、という解釈で良いのでしょうか。
*(i+p)ってかけるか?
>>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
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 の領域ではなくなる。
ありがとうございました。 4["Hogehoge"]ってのも何かとんでもない所を指してそうで気持ち悪いですけどちゃんと動くんですね。 argv[4][3]は4[argv][3]と3[4[argv]]と等価? 頭痛くなってきた…
>>532 ええと、まだ初歩的な愚問をしてもいいですか?
もし関数内でデータをメモリにロードして
関数内で宣言したポインタでそのデータを指して使うとして
関数がreturnした時、そのロードしたデータはどうなりますか?
すみません。意味不明なこといってたらスルーしてください
char * function() { char buffer[1024]; read_buffer(buffer); /* buffer にデータを読み込んだ */ return buffer; } もし、こういうことだったらそれはできない。 この関数を抜けたときに buffer は開放されているから。 こういうときは呼び出し側でバッファを用意するのがいいとおもう。
>もし、こういうことだったらそれはできない。 補足。 これは、return buffer されたアドレスのデータを、呼び出し側の関数で つかっちゃだめよ、ってことね。
static char buffer[1024];
>>539 == static の意味を今理解した香具師
そんな煽りはありえない
malloc
>>543 == malloc の意味を今理解した香具師
そんな煽りはありえない
free exit
代入文には左辺値が必要です
>>547 == free,exit の意味を今理解した香具師
>>548 == 代入文、左辺値覚えたて厨
そんな煽りはありえない
>>536 補足の補足。
少しトリッキーになるが、リターン先で呼び出し先のスタックが生きてい
るうちに返されたアドレスバッファの内容をどっかにコピーすれば使える
が、知ってて使わないと色んな意味で危険。
トリッキーじゃなくてデンジャラス
知ってて使っても色んな意味で危険。
ダンゲロスって何なんだYO!
お前ら糞レスしている暇があったら新スレ立ててこい。
ダンゲロスのせいで
>>559 がおかしくなった。
お前ら責任取れよ。
だってダンゲロスじゃんかじゃんかYO!
ひょっとしてダンゲロウスの間違いかな?
dangerous
ダンゲウロスは馬っぽいけど、ダンケロスは怪獣っぽい。
566 :
デフォルトの名無しさん :03/11/02 19:58
つーか、どの言語もバカばっかりで安心しました
C++スレから追い出されたんですね。
568 :
デフォルトの名無しさん :03/11/02 20:05
>>567 いえ、ジャバです
でも追い出されたわけではなく
自分のCの勉強の合間に一応全部見ておこうと
スレを見てきたんですが、539あたりから
ジャバスレと同じような展開が随所に見られ
「ああ、どこにでもこういう人たちはいるんだな」
と、安心したわけです
ちなみに俺の言う「バカ」は、けして悪い意味ではありませんので・・・
570 :
デフォルトの名無しさん :03/11/02 20:12
>>569 ==あぶり出しに引っかかった、オレンジ厨
クスクス
アフリカ料理食いたいね
フランス料理って物を一度ちゃんとしたとこで食べてみたい・・・ でも、作法がよくわからんし。。。
574 :
デフォルトの名無しさん :03/11/02 22:03
ふふぉぺn
作成したファイルを fclose した後にそのファイルを削除しようとしても使用中っていわれてできません. でも、プログラムを閉じると削除できます。 どこが悪いのでしょうか?
同じファイルを複数回開いて一度しか閉じていないとか。
>>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+を色塗りすればアムロ専用だと自慢できるので御得です。
>>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] と同じ。
>>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の変数の値」は全然違うものだぞ。
>>595 あ、そうか!
sizeof(data[0][0]に入っている値のサイズ)っていうより、
sizeof(data[0][0]のサイズ)って意味ですね!
ありがとうございます!!
>>597 ちなみに括弧はいらない
必要なのは型の大きさを知りたいとき(キャスト式なんだそうだ)
>>598 そうなんですか!勉強になります。m(__)m
600
601 :
デフォルトの名無しさん :03/11/04 09:21
プログラミングの力を生み出す本―インテルCPUのGNUユーザへ 橋本 洋志 (著), 松永 俊雄 (著), 冨永 和人 (著), 石井 千春 (著) この本ってかなーり初心者向けの本ですかね? スレ違いですみません 読んだ人います?
ゲームにあるセーブ機能ってC言語でいえばファイル操作関連?
比較対象が意味不明だが… ファイル操作というよりむしろポインタの退避の方が近いんじゃないのか?
ポインタ退避… 何をセーブする積もりだ?
オブジェクト間のリンク
すまん ポインタじゃなくてプログラムカウンタの間違い
>>604 ポインタ=メモリとして、エミュレータによくあるリアルタイムセーブとか。
例えばのそのゲームに使っている変数をすべてセーブしたい時とか。
>>608 このスレはCオンリーだから他スレで聞いた方が良いよ。
>>602 どこにデータをセーブするかによる。
一般的なPCのゲームだとINIファイルやレジストリに保存するだろうし。
コンシューマならメモリカードなど、電池によって電圧を与えてるRAMだろうし。
INIファイルならファイル操作、
レジストリならレジストリ操作、
と言った感じに時と場合による。
>>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! (←ここ注目)
>>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()に戻った段階で、有効ではなくなっている。
有効でなくなったんで、他の処理で使ってしまっている。
>>619 なるほど。
メモリに書き込んでるから、別にローカル変数だとか気にしなくて
いいと思っていたんですが、そうではなくて、スコープから出たとたん
結局リセットされてしまうのですか。
とりあえず、anserを環境変数にします。
ありがとうございましたm(__)m
>>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
>>
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;と書く馬鹿が多い。
どこで推奨されてるのかな
俺は int* p 派だが、他人が読むコードなら int *p の方がいいと思うよ。 ベタでだけど、 int* a, b; って書いた時に int *a; int b; にしかならない。
638 :
デフォルトの名無しさん :03/11/05 17:29
高橋 麻奈 さんのやさしいCを買おうかと思ってたんですが 第2版が出たみたいなんでそっちにしようかと思ってるところなんですが 何かかわってるところがあるんでしょうか?
type* var; と書く人間は、一行づつ変数宣言する事を前提にしてる気もするな。
>>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 >>1 ぐらい読んでくれ。
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
GUIの意味が分からなかったに100ペニー
標準Cでできると思ったに120ペニー
663 :
デフォルトの名無しさん :03/11/05 19:14
int* p;
665 :
デフォルトの名無しさん :03/11/05 19:19
* p;
:-P
>>658 本がないなら、とりあえずK&Rからだろう。
669 :
デフォルトの名無しさん :03/11/05 19:25
670 :
デフォルトの名無しさん :03/11/05 19:25
int* *p;
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
main(int envp
682 :
デフォルトの名無しさん :03/11/05 20:40
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 それ空けすぎだろ、でも見易くなるのはあるかな。
(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を実装する
>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が疑問に思ってることはCの初歩の初歩でしょ。 そんなの検索すりゃいっぱい出てくる。 そういった自助努力もせず、すぐ人に頼るのはいかがなものか・・・
なんでもフリーで手に入れようとする所とか?
>714 はぁ? 手段の話をしてるのに何でフリーって出て来るんだ? 筋違いな話は遠慮してもらいたい。
710が初心者かどうかって与太話じゃないのか
710は小学生?
710が初心者だろうが小学生であろうが関係ない。 1つ言いたいのは人に訊く前に自分でやることがあるだろう、 ってことだけさ。
みんな煽られて(ry
710が釣り師ってことでOK?
723 :
デフォルトの名無しさん :03/11/06 13:02
配列の作り方を教えてください。 int[] array;とやったのですができませんでした。
int array[1]; なんか一冊くらい本嫁
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 さっきから逆アセンブルについて聞きまくってる馬鹿ですか?
ああそういうことか・・・
>>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
745 :
デフォルトの名無しさん :03/11/06 21:08
連想配列使いたい
750 :
デフォルトの名無しさん :03/11/07 17:25
超初心者で済みません。 エディタはTeraPadを使っているのですが、 エスケープシーケンスの"\"を入力する方法をどなたか教えて下さい。。 キーボードで入力すると"\"か"_"で表示されて文字コード表からコピーしても違う文字になってしまいます、、、、。
円マークも右スラッシュも同じ。
「右スラッシュ」ってはじめて聞いたかも。
753 :
デフォルトの名無しさん :03/11/07 17:33
キーボード配列上の左右?
755 :
デフォルトの名無しさん :03/11/07 17:35
質問です。 まず、100人分5教科の点数をデータにしました。G[101][5]としてあります。 それを読み込んできて、全員の各教科ごとの偏差値を出し、ファイルに書き込みたいのです。 偏差値計算に必要なものは、各教科の平均点、標準偏差です。 3つfloatを使ってやるというヒントはもらったのですが、さっぱりです。 ヨロシクお願いします。
>>757 ってなんですか?
質問に不備あったら聞いてください。。。よろしくお願いします。
(´-`).。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
配列はポインタなの。 でも配列とポインタは違うの。 配列=ポインタとなる場合があるの。 C FAQを見れば早いの。
>>769 ,
>>770 ,
>>771 ありがとござんす。
いや、この場合配列が要素を含めて丸ごとtypedefされているんで、
普通に配列の先頭を渡すのとはワケが違うのかとおもたですよ。
typedefは、typeをdefするだけだし。
>>772 タイプデファは単純に展開するだけなの。
ただ展開するだけだからプログラムの内部的には何も変わらないの。
オレも勘違いしてたの。
>>761 getsはサイズをチェックしないので
文字列たくさんいれると溢れて
メモリ領域を破壊するので危ないみたいです
>>762 フォーマットバグという単語を使ってしまったのはミスでしたね
フォーマットバグとprintfで検索してprintfの危険性がわかりました(゚ー゚*)フフフ
%nを使うといいらしいですね
フォーマットバグって
>>765 のようなコードで起こるものじゃないの?
そうは読めませんね
>>779 「%nを使うといいらしいですね」と言っているが。
それと、760は「フォーマットバグ」という言葉を使っていないのに使ったと言っているのもよくわからない。
無理すれば検索時にprintfを含めずフォーマットバグだけで検索してしまったとも読めるけど。
>>775 (゚ー゚*)フフフ
よりも
( ̄ー ̄)ニヤリッ
の方がみんなが理解してくれたかもな
ああそういうことか。 本当にいいわけじゃなくて、、、
>>760 =775は、フォーマットバグを理解してないな。
じゃなきゃ、
>>775 みたいな発言は出来ない。
>>784 「いい」ってのはそれを使えばフォーマットバグを含んだプログラムのセキュリティホールをつつけるという意味らしい、、、
あ、785=783
>>785 そうか、そういう意味だったか。
わざわざすまん。有難う。
790 :
デフォルトの名無しさん :03/11/08 02:21
質問です! 文字列でないバッファーの中に アスキー値が 'A' 'B' 'C'の並びで連続するアドレスを得られる 標準関数があれば教えてください。 それとも、こおゆう場合はmemchrで調べるのでしょうか?
793 :
デフォルトの名無しさん :03/11/08 02:30
>>790 memchrとmemcmpを組み合わせる
794 :
デフォルトの名無しさん :03/11/08 04:40
今構造体とファイル操作の練習プログラムを作っています、名簿管理的な。 それで、打ち込み形式で作った名簿ファイルを保存するまではうまくいったんです。 ファイルを読み込み、構造体にデータを入れる作業がわかりません・・・。 ものすごく初歩的な質問ですまそ
構造体の各要素にscanfとかで代入するコードを書く
>>795 すいません、詳しく教えてもらえませんか?
保存できるんだったら、その逆をすればいいだけだと思うのだが。
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); } コレが保存関数です、ハイ・・
あ、ソース上げてしまった。すまんです・・
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かは知らんけど。
保存されたファイルが、たとえば aiueo 17 tokyo 176 oeuia 26 kyoto 168 みたいな感じに保存されてるんですが読み込めます? どーもうまくいかんのです
構造体の定義を知りたい。
>>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); 特に変なことはない気がするんだが...。
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)); /* ここで読み込む */ }
いや待て。ここは宿題スレではなかったな。
>>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++を使いましょう
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つ、何かお勧めの製品を探しているのですが
何を使えば良いのかよくわかりません。
皆さんはどんな製品を使っていますか?
inline とか restrict とか使えるし、覚えておいて損はないと思うけどな。
compound literal も始めはキモかったが、慣れると便利なこともある。
>>820 のようなスコープの問題なんて、瑣末な事だと思ふ。
>>826 C++、C# は言語。C とは違うのでスレ違い。
ANSI C、C99 は C の規格。
正しい理解は正しい言葉から。これぐらいは Google でも調べれるから
一回、キチンと頭の中身を整理しる。
>>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);
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; }
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); }
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)); }
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); }
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
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 みんなやれ。 プログラミングは人を楽にする為にいかに自分が苦労するかを楽しむもんだ。
842 :
デフォルトの名無しさん :03/11/08 20:53
とりあえず質問だけどC言語ってどれぐらいで習得できるの?
>>842 とりあえずってレベルでいいんなら1週間もあれば。
とりあえずモチベーションによる。
とりあえず質問だけどC言語ってどれぐらいの間使わないと忘れるの?
とりあえずってレベルでいいんなら1週間もあれば。
とりあえずモチベーションによる。
モチベーションにもよるが、一週間程度で忘れてしまうのか(;´Д`) 日頃の鍛錬を欠かさんとこ
最低でも二重ポインタや構造体配列あたりまで使えんとまるで話にならんぞ。 あと分割コンパイルな。リンカわかってないやつ痛杉。
個人レベルで分割コンパイルって必要ある? 仕事したことないから分割コンパイルの利点が分からん。
>>852 ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
>>852 個人レベルだけど
ソースのサイズが1メガバイト越えるのが当たり前なので
分割しないとコンパイル時間が長すぎて駄目
855 :
物凄く初心者 :03/11/09 00:09
「0以上の整数n,kに対し、 組み合わせの数nCkを与える関数combination(n,k)を定義せよ」 が分かりません。 何方か教えてください。お願いします。
そんなの個人じゃない!
>>855 ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
>>852 混じれ酢すると、
個人レベルでもいちいち全部をコンパイルするのが
面倒なくらいのサイズになることは多い。
あとは、機能ごとにファイルを分割しておけば
再利用したいときに便利だし、
ソースも読みやすくなる。
>>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も分からないです・・・。
暇な方がいたら教えてやってください。お願いします。
ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
( ゚д゚) ・・・
ヒソヒソ(´д)ヒソヒソ(´д`)ヒソヒソ(д`)ヒソヒソ
サリンサリン(´д)サリンサリン(´д`)サリンサリン(д`)サリンサリン
( д )
俺の陰口ばかり喋るなあああああああ!!!!!
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 が入ってるから正しく表示されない。
ああ、そうじゃなくて、二バイト文字の間に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
お前ら明日はポポロクロイスですよ。
もまいら、ワラタw
884 :
デフォルトの名無しさん :03/11/09 01:04
>>882 キャラクタは前作の方がなんとなく好きだ。
888 :
デフォルトの名無しさん :03/11/09 01:22
888
>>879 5.1.2.2.3 プログラム終了処理
main関数の最初の呼び出しからの復帰は,main関数が返す値を実引数としてもつexit関数の呼び出しと等価とする。
認めたくないものだな。自分自身の、若さゆえの過ちと言うものを・・・。
ヒソヒソ( ´Д)ガンヲタ?(´д`)ヒソヒソ(д` )
激臭のシャア
894 :
デフォルトの名無しさん :03/11/09 02:11
macのXcode使ってる方いらっしゃいますか? 使い方がよくないのか分からないのですが、 hello worldすらビルドできなくて困ってます。 何か必要なこととかってあるんですかね?
895 :
デフォルトの名無しさん :03/11/09 02:27
平方採中法のプログラムを教えて下さい。 数字を入力して、それを2乗した結果から、その結果の真ん中を 入力した数字の桁数をとってまた2乗するらしいです。 それを繰り返すらしいのですが・・・ わからないので教えて下さい。
あちこちで宿題房が大量発生してる・・・
この流れは!!
はわわ〜
・・・こんな時間に悲しくないか?
ヒソヒソ(´Д)ヒソヒソ(´Д`)ヒソヒソ(Д`)ヒソヒソ
東鳩やったけどマルチが出る前に飽きてやめた。 ぱっと落としてやるかな。
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 指数部と仮数部の有効数字を合計してみそ
整数型と大差ないだろ
有効桁数ね 失礼した
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; }
↑%dは%lfにして下さい。すいません。 では、よろしこおねがいしますです。
突然すみません、質問です。 /* 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次くらいまでにして作りたいんですが 色々試してるんですが全然分かりません。どうやればよいのか教えていただければ幸いです。よろしくお願いします
>>837 839
C言語は、VBとかDELPHIとかと違って「これ」っていうのがないんのですね。
本屋さんに特定のC言語に関する本が極端に少ない理由もなんとなく飲み込めてきました。
そんななかで覚えていくというのは大変そうですね。
ごちゃごちゃになちゃいそう^^;
ともあれ、これ以上は実際にためしてみないとわからなさそうなので
教えていただいたVC/Borland/gccのなかで購入を検討してみます。
あと、何か簡単な本をさがしてみますね。
どうもありがとうございました。
イタタタタ・・・
>>907 すいません間違いです。floatと見てくれればいいです。
>>909 ありがとうございます。でもそれだったらdouble型は8バイトなんだからあってるのはおかしいんじゃないですか?
+eっていうのはどうしたんだっていうのも気になるし。
その辺のビットがどのように対応してるかとか分ります?
とゆーか初心者はこんなとこまでつっこまないほうがいいのかな・・・。
>>918 いや・・、これはもうすでに探してますけど、詳しく載ってるところがないです。
1234560000000000は1.23456*(10の10乗)と表すことができる
32バイトくらいほしいよね(o^-^o)
マジで、マジで
>>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は型で変数じゃないと思うんだが
>>933 コンパイルエラー多発するソースを挙げんな
typedefは型をでぃふぁいんするもの
でぃふぃにしょん
939 :
デフォルトの名無しさん :03/11/09 23:41
>>933 > prinft("%s\n",hoge->foo1);
推敲を省略する奴の発言は見るだけ時間の無駄
ぷりんふと
>>939 突っ込むべきところはそこか?そこなのか?
void prinft(const char *a,char *b) { printf("bye"); } なるほど。こういう落ちか。
> そもそも、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で結ぶって方法もある。 使ったことないけど・・・・
>まず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日問題は別なのだが
厨房死ね
C言語を習い始めてアプリケーションを作れるようになるには何日くらい必要ですか?
3週間くらいじゃない?
次スレは?
乙
質問します。 配列を定義すると、要素がはじめから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 まさか、プレーンテキストで返ってくる事を期待してないよな?
982 :
デフォルトの名無しさん :03/11/14 13:02
>>977 みたいな処理って、バイトを2進数を表す文字や16進数を表す文字に直さないとダメじゃないの?
984 :
デフォルトの名無しさん :03/11/14 18:29
>>983 だって、つまりファイルダンプしたいってことでしょ?
バイナリファイルを2進数や16進数の文字で表す場合
それしか方法ないと思うけど
986 :
デフォルトの名無しさん :03/11/14 19:12
_____ |キャンセル|  ̄ ̄ ̄ ̄ ̄
>>977 一度,バイナリエディタという類のソフトを使ってみるといい。
16進ダンプとASCII(モノによってはUNICODEなども)は別々に表示される。
これは,ASCII文字とバイナリデータを区別する手段が無いため。
おまいも別々に表示しろ!
今日はじめてCやってみたけど、窓開けられねー
989 :
パスカルの三角形がわかりません。 :03/11/14 22:10
UNIXのC言語なんですけど数字を入力したら↓みたいになるプログラムがわかりません 4 * * * * * * * * * * あと負の数字を入れたらこうなります。 −4 * * * * * * * * * * よろしくお願いします。
マルチ、止めれ。
マルチ氏ね
埋め立てなら私に聞け!
****
***
**
*
**
*
maruti
**** *** ** *
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。