>>1 乙
スレタイと微妙に異なるんですが、
計算量がもっとも少ない双方向リストのソートアルゴリズムは何か
教えてもらえないでしょうか。
よろしくお願いします。
双方向のリストでそのままソートすんなよ
いったんmallocで配列作ってそれを、qsort
そのあとリストを作り直す
大きさにもよるが速度と汎用性でピカイチだこれ
5 :
デフォルトの名無しさん:2005/08/08(月) 09:36:29
C言語をはじめたばかりであまりわからないのですが、
char *hoge;
scanf()で取得した文字列をhogeに入れ、atoi()したいのですが、
この場合、atoiに失敗した(数値に直せない)場合も、atoiに成功して戻り値が0の場合も、どっちも0が返ってきてしまいます。
今はstrcmpでマッチ文字列を0、00、000(ryとforでループさせて調べるようにしていますが、
もっと簡単な方法があれば教えてください。
VS.NET、gccを使っています。
10 :
デフォルトの名無しさん:2005/08/08(月) 13:09:59
即答ありがとうございました。
12 :
デフォルトの名無しさん:2005/08/08(月) 13:39:25
>>8 ポインタ変数には文字列は入らない訳だが。
文字列が入っている領域へのポインタ値を入れるべきだ。
>>8 文字列の取得にscanf()は辞めたほうがいいと思われ
というのは古いのか?
それと、
>>12にもあるが
*hogeの宣言でだけでなく、mallocなりでメモリをアロケートしなくちゃむりぽ
小規模コードなら、配列で世伊部?
>>4 エーッ、マジっすか?
てっきり横着者の手法だと。。。
回答ありがとうございますm(_ _)m
リンクリストでもクイックソートできるけど、ま、配列に入れてqsort()を呼ぶのが楽だな。
17 :
デフォルトの名無しさん:2005/08/08(月) 18:10:46
char* hoge;
char *hoge;
はどう違うのでしょうか?
違わない。好みの問題。
書き方
20 :
17:2005/08/08(月) 18:14:38
ありがとうございました
>>17 自分は
char* hoge;
が好き。
その上で、
char* hoge, *fugo;
は書かず、必ず
char* hoge;
char* fugo;
と書くようにしてる。
23 :
17:2005/08/08(月) 18:33:37
char* hoge, geho;
ってかけないんだ しらなかった
int i;
int j;
int k;
だるー
>>23 書けるけど、
char *hoge;
char geho;
と同意になる。
char* hoge, geho; だと、どっちもポインタに見えて厄介でしょ。
26 :
23:2005/08/08(月) 18:53:13
ごめん、俺17じゃない
char* って、キャラ型のポインタ宣言じゃなかったんだ
いつも char *hogeでやってて使ったこと無いからしらんかったよ
int a, b, c, d, e, ,i ,j;
ひいぃぃ。やめてやめて
よく一文字変数にiってみるんだけど
なんか理由あるの?
>>30 fortranはIからNで始まる変数名は整数型と決まっていた。
その頃からの流れで、Iterationの頭文字でもあることから
basicやCでも未だにi一文字の変数名が幅を利かせている。
iterator の i だったり int の i だったり、習慣や慣れだったり。
iterator では it 派の漏れ
34 :
34:2005/08/08(月) 19:50:47
質問です。
ファイル読み込みの時に1行ずつファイル名を書いて読み込ませるのが、とても面倒臭く苦しんでおります。
ファイル名に数字を入れてループ文を使い一気に読み込ませる方法があると聞きましたが詳しいやり方がわかりません。
すみませんが、教えてください。
>>34 そのファイルの命名に、規則性があれば、いくらでもやりようがあるけど。
37 :
34:2005/08/08(月) 19:57:51
自分の考えではファイル名をa*.txtという風にして*を0からの数字にしようと思っているのですが、
for(int i=0;i<10;i++)
{
ファイル読み込み("a"+i+".txt");
}
のようにやってみたのですがうまく行きません。
まいりました・・。
sprintf()って知ってる?
ファイル名をsprintf()で作れよw
+i+ってなに?
始めてみた
初めて・・・ orz
>>37 しかもfor-statementで変数宣言ですか
>42
ベーシックとかスクリプト系ではよくみかけるな
>>37 とりあえず、入門書の一冊でも読んでください。
>49
文字列編集だよ
forの中で宣言したらforの中のローカル変数になるんだっけ?
52 :
34:2005/08/08(月) 20:02:57
すみません。知りません。
そのsprintfについて少し調べてみます。
>>46 処理系によってスコープ範囲が違うからあまり使わないようにしてます。
>>51 初期のころはfor-statementが出てきたところのスコープの末尾まで。
改定された規格ではforの中だけ。
未だにこれ引きずってる処理系はあります。
>53
>初期
for(int i=0;i<10;i++)
{
...
}
for(int i=0;i<10;i++)
{
...
}
これがエラーになるのはどう考えてもバグだろw
改定だぁ? はぁ?
56 :
34:2005/08/08(月) 20:14:32
やはり、どうすれば良いのかわかりません。
皆さんの討論にすらついて行けません・・・。
とにかく"a0.txt"と"a1.txt"と"a2.txt"をループ文で一気に読み込めればよいのです。
一番簡単な方法を教えてください。
くだらないと思った人は無視してください。
身勝手な申し出ですみません。
だからsprintf()でファイル名を編集汁!
そのファイル名を使う!
FILE *fp;
char filename[256];
for(int i = 0; i < 10; ++i)
{
sprintf(filename, "a%d.txt",i);
fp = fopen(filename, "r");
;
fclose(fp);
}
C99規格で,変数の宣言の位置に関してはC++風になりました.
62 :
34:2005/08/08(月) 20:26:01
>>59 ありがとうございます。
自分の知らないプログラムを見ると、そんな手があったか~と毎度思ってしまうほど鮮やかです。
毎度と言えるほどプログラムを書いた事はありませぬが。
本当にありがとうございました!!
63 :
デフォルトの名無しさん:2005/08/08(月) 21:18:23
+i+って・・・ここはJavaScriptのスレじゃないんだが・・・
そこはJavaって言ってあげるとこだろ
お馬鹿
67 :
デフォルトの名無しさん:2005/08/08(月) 22:23:19
HTMLのなかからリンクだけを取り出す関数というかライブラリはありますか?
regex
>>68 正規表現でどうしろっていうの?
自分で抜けって事?
>>69 過去形なのはどういう意味?
>>67 char* path = (ファイルパス)
char html[MAX_HTML];
char url[MAX_URL]
char *link_begin, *link_end;
FILE* fp;
fp = fopen(path, "r");
fread(html, sizeof(char), MAX_SIZE-1, fp);
fclose(fp);
link_begin = html;
while((link_begin = strstr(link_begin, "href=\"") != NULL) {
link_begin += 6;
link_end = strchr(link_begin, '\"');
*link_end = 0;
strcpy(url, link_begin);
*link_end = '\"';
}
(目的の処理)
link_begin = link_end+1;
}
適当に書いてみた。
72 :
71:2005/08/08(月) 23:05:30
while((link_begin = strstr(link_begin, "href=\"") != NULL) {
ミス。括弧が足りなかった。
while((link_begin = strstr(link_begin, "href=\"")) != NULL) {
いろいろと問題有だな
最後の中括弧はなんだ?
75 :
71:2005/08/08(月) 23:16:46
余計な中括弧が残ってたかorz
恥かくだけだからもうやめるわ
>>71 うちも書いて欲しいから
めっちゃ応援してる
頑張って書いてくれ
じゃ、変わって失恋プログラマがいきます。
/*ノーワーニング、ノーエラーなら彼女がよりを戻しに来る*/
//"href=\""があるか調べる
char *ishref(char *str)
{
int len[2], i, cmp;
char *ret;
len[0] = strlen("href=\"");len[1]=strlen(str);
cmp = -1;
for(i=0;i+len[0]<len[1]&&cmp!=0;i++){
cmp = strcmp("href=\"", str);
if(cmp==0){
ret = str+i+len[0];
}else{
ret = NULL;
}
return ret;
}
void folink(FILE *fo, FILE *fhtml)
{
char ss[256];
char *p[2];
while(fgets(ss, 256-1, fhtml) != NULL){
if((p[0]=ishref(ss))!=NULL){
p[1]=p[0];
while(*p[1]!='\"')p[1]++;
*p[1]='\0';
fprintf(fo, p[0]);
}
}
}
cmp = strcmp("href=\"", &str[i]);
だった・・・
もう駄目だな。。
これどうなってんの?
失恋したorz
ねえマスター、作ってやってよ
涙忘れるソース
ねえマスター、
ねえマスター、
ねえマスター、はやくぅ
誰もがhref="と空白を空けずに書くと想定するのは如何な最中と。
MSHTMLでも使えってことですね
>>77 void main(void) {
printf("ガンガレ!\n");
}
htmlcxx ってC++じゃなかったか?
char *ishref(char *str)
{
char target[] = "href=\"";
char *ret;
int targetlen = strlen(target);
int len = strlen(str);
int i, j, k;
j=0;
for(k=0;k+targetlen<len;){
for(i=0;i<targetlen;){
while(isspace(str[j])){j++;k++;}
if(str[j]==target[i]){
i++;
}else{
break;
}
}
}
if(i==targetlen){
ret = str + j + 1;
}else{
ret = NULL;
}
}
こうかー
完全な初心者です。
C言語を覚えたいのですが、環境を整える段階で早くも詰まっています。
Visual C++、gcc、LSI C-68等のコンパイラでオススメの物を教えて下さい。
当方、windousXPです。
>>90 スレ違い。VCでもgccでもいいけど、整備の仕方が判らないなら該当スレへどうぞ。
LSI-Cは無条件に薦めない。
92 :
90:2005/08/09(火) 09:30:58
>>91 ここかと思っていました、すみません。
スレ違いなのに答えてくださってありがとうございます。
93 :
デフォルトの名無しさん:2005/08/09(火) 20:06:26
質問です。
int unko(int a, int* b, int c) {
return a+*b+c;
}
int (*ok)(int a, void* b, int c);
ok = unko;
としてもコンパイルエラーにはならないのですが、(gccだとデフォで警告orz)
これは一般的なテクニックとして利用しても大丈夫なのでしょうか?
すみません、void* をプロトタイプに持つ関数のポインタに、
その位置にvoid* 以外の型のポインタ変数を持つ場合でも、
コンパイルエラーにならないってことです。
一般的なテクニックだあぁ?
おまえのオナニーテクニックだろ
unkoの型をvoid*に合わせて演算するところでintにキャストせぇよ
なにがやりたいんだかわからん
いや、何がやりたいかは別に分かってもらわなくても良いのですが、
この様な使い方(プロトタイプに合ってない関数をキャストなしで代入)は
すべきじゃないかを問いかけただけです。
>unkoの型をvoid*に合わせて演算するところでintにキャストせぇよ
すみません。例が意味不明でした^^
これはあくまで単なる例なので、気にしないでください。
for(~~){
if(~~){
if(~~){
break;
}
}
hoge++;
}
これでbreakが実行されるとforから抜けることになるんですか?
それとも外側のifを抜けてforのhoge++が実行されるのでしょうか?
errnoでセットされた値はプログラマが明示的に
クリヤーする必要があるんですか?
>>97 まずはおまえ自身でやってみろよ
なんだかもう・・・
すいません。友人の家でふと疑問に思ったのです。
書き込みも友人のPCなのでコンパイラをインストできないんです。
今日は泊まりなので家にも帰れませんし。。
べつに急ぎじゃないんだろ?
帰ってから思う存分やれ
>>98 1.errnoは、エラーになったときだけセットされる
2.errnoは、エラーになったときだけ参照する
1.2.より、通常は明示的にクリアする必要は無い
>>101 調べると「ループやスイッチ」が対象みたいなのでforから抜けるみたいですね。
どうもでした
105 :
デフォルトの名無しさん:2005/08/09(火) 20:37:20
ところでさ、なんで break の対象は ループや「スイッチ」 なんだろうね。
switch文を抜けるのまで 同じ「break」 である必要はあったのかね・・・
sbreak とか、別ものにして欲しかったと思うことは無いか?
答えろ!
>>107!
>105
厨房は黙ってろよ
>別ものにして欲しかったと思うことは
ないな。以上
breakじゃなくてgotoにしてほしかった。
>>93 一般的なテクニックではないな。
Cはそういうところのチェックが甘いし。
>>106 forやwhileの中で、switch文の中からbreakしたくなったことは
一度も無いのか?
goto
>>93 テクニックというには、使いどころが無さ杉な気がする。
breakなんswitch以外で使わなければいい
俺は全部gotoにしてる
で、うじうじそんなことを考えてどうするつもりかね。
>>111 やはりそうですか。ありがとうございました。
>>115 ポインタをコールバックで渡すとき、
呼ばれた側だけが型の情報を知っている場合に、
別の変数にキャストしなくてもいいので便利かな、と思いまして。
>>117 ストールマンとコンパやって、やつが酔っ払ってる隙に
gccのソースを直す。
>>116 俺は極力goto使わないようにしてる
「gotoレスプログラミング」っていうぐらいだし
俺は極力 後藤 使わないようにしてる
「後藤カスプログラミング」っていうぐらいだし
でも多重breakしたいときには仕方がないから使う。
gotoレスくらい、ほとんどの人が分かり切ったこととしてるはずじゃないのかいな。
多重ループを脱出するときは、「仕方がない」という意識ではなく、ここぞ使う場面だ
と思って使うが。
124 :
122:2005/08/09(火) 22:11:06
>>123 JavaとかDにはラベル付breakなるものがあるらしい。これなら多重breakにgotoを使う必要がなくなる。
これがないCでは「仕方なく」gotoを使うことになる。もちろんラベル付breakをCに導入しろとは全然思っていない。
俺はJavaもDも使ったことがないけど。
>>123 そういう場面になったら俺の場合、gotoを使わなくてすむようにロジック組みなおす。
まあ仕事でやってる人はそういうわけにもいかないんだろうけど
126 :
デフォルトの名無しさん:2005/08/09(火) 22:29:02
いや、ほんとくだらねぇんですけど。
「引数」と「値を返す」
の基本的な二つの語句の意味がいまいち理解しきれません。
イメージとしては掴みかけているような感じはするんですけど。。。
>>124 >もちろんラベル付breakをCに導入しろとは全然思っていない
俺はぜひ導入してほすぃと思うが。害はないだろ?
イメージとしては
↓引数
← foo(a)
値を返す
故後藤先生は、なぜgotoが不当に迫害されなればならないのかと悩んでおられた。
gotoを使う奴は強盗
近藤さんは毎晩悩んでおられた。
132 :
デフォルトの名無しさん:2005/08/09(火) 22:35:48
おまえら本当は、
「gotoを使っちゃダメ」ってエライ学者さんが言ったから使ってはいけない、
程度にしか理解してないのだろ?
ごめんなさい先輩風吹かしたいだけです
>>127 反対する気はないが、今さら導入したところで、あまり意味がないよな。
gotoを使わないことが自己目的化して関数分割しすぎて
可読性損ねる馬鹿プログラマには参る
ダイクストラは、羮に懲りて膾を吹くという感じでgotoを全面否定することはないだろうにな。
140 :
デフォルトの名無しさん:2005/08/09(火) 23:40:00
>137
習いました
>羮に懲りて膾を吹く
読み方プリーズ
しつけにこりてろをふく?
>>141 あつ‐もの【▼羹】〘名〙
野菜や魚肉を熱く煮立てた汁物料理。◇「熱いもの」の意。
羹(あつもの)に懲こりて膾(なます)を吹く失敗にこりて、必要以上に用心深くなる。◇熱かった羹にこりて膾のような冷たい料理も吹いて冷ます意からいう。
あつものにこりてなますをふく
熱いものをはふはふして食べたあとに、冷たい副菜を思わずふーふーしてしまう様から、
ひどい目にあって、同じ目を二度と見ないように、過剰な反応をするの意。
あつものにしこりてなますをふく
>>140 お前見込みないわ…コミュニケーション能力が…
習ったけど、理解はしてないよ
ということでしょう
どっちにせよ見込みないわ
142を直す
>羹(あつもの)に懲こりて膾(なます)を吹く失敗にこりて、必要以上に用心深くなる。
羹(あつもの)に懲(こ)りて膾(なます)を吹く 失敗にこりて、必要以上に用心深くなる。
>>144 ネタか?
にしこり
できるだけ配列をポインタ扱いでコーディングするように努めてるが、構造体へのポインタの
2次元配列を、それぞれの次元のインデックスや、1次元目の要素数からアドレス計算をしながら
ポインタ扱いして、更にchar * のメンバ変数で文字列を扱ったり、関数の引数にアドレスを渡し
て、関数の中では、もう一段階進んだポインタを扱うことになったりして、苦心惨憺してしまうのお。
関数ポインタの配列も必要だし。
そういうことで悩んでしまうが、どうしようかいな。
っ[C++]
そういうことで悩むならC++使った方がマシ
だからC++が使えない開発環境なんだよ!
いや、今はC++ BuilderでWindowsプログラムのイベントハンドラにC言語のコードを差し込んでるんだけどな。
>>できるだけ配列をポインタ扱いでコーディングするように努めてるが
(バッサリ略)
センスの悪い奴がわかってるつもりでへんに頭をひねったつもりになっても、
ちぃ~ともなぁ~んの解決にもならん、というだけの話かと。
>>156 何だ、半人前のCプログラマの分際で何を言ってるんだ。
コピペしてはりまくってください。
9/11選挙では 最高裁裁判官の国民審査もあります。下記2人にはご注意を。
「外国人参政権反対」という主張の人は下の二人(賛成派)を落とすべきです。
[裁判官 滝井繁男の反対意見]
・外国人の地方選挙権を付与することを禁止しているものではないのである(スゲー!)
・日本人に限られるのは地方公共団体の長だけでいい。(スゲー!)
[裁判官 泉德治の反対意見]
・地方公共団体は,国が日本における在留を認めた外国人について,当該地方公共団体内における活動
を自由に制限できるものではない。(スゲー!)
・特別永住者が地方公共団体の職員になることを禁止する法はない。
・地方公共団体でトップ、警察、消防、以外なら、外国人を任用してもいい。(スゲー!)
可読性を高めるのに配列形式の方が良いとなれば
当然そうするし、ポインタの方が良いとなれば当然
>>159 どちらが可読性が高いのか
を決めるは当然、開発担当者?
>>156 お前は何の応用力もなく、進歩できないからといって負け惜しみを言ってるだけだよな。
>ちぃ~ともなぁ~んの解決にもならん、というだけの話かと。
お前よりは多くの問題解決の実績があるはずだな。
>>150 がどういう状況でどういうコードを書いているか分からんし。
163 :
データボックス:2005/08/10(水) 13:40:38
そうか、Cを完璧にしないうちにC++に進んでもいいのかいな。
>>163 Cを完璧?
完璧の定義は?
負け惜しみにもほどがあるな
「C も使えん香具師にはC++は無理」
「藻前に Cは無理、C++でも使っとけ」
どちらの発言にも一面の真理が含まれている。
高級アセンブリ言語Cを究めなくてどうするんだろうな。
究めてから言えや
170 :
デフォルトの名無しさん:2005/08/10(水) 19:12:47
こんばんは、よろしくお願いします。
char 型の配列を一度初期化して、
もう一度値を入れて生きたいのですが、
どうすればよいのでしょうか。
char a[100];
a = "ああ";
a = NULL;のようなこと死体のですが、これではむりです。
a = "いいいい";
char *a;
a = "ああ";
a = NULL;
a = "いいいい";
173 :
デフォルトの名無しさん:2005/08/10(水) 19:56:00
>>173 char a[100];
strcpy(a, "ああ"); /* #include <string.h> */
*a = '\0';
strcpy(a, "いいいい");
関数の引数に hoge(&a)
みたいにアドレスを渡す時って、関数の仮引数に int hoge(*aa)
と書くことが多いだろ?
本で読んだときからずっとハテナだったが、a=10 で &a=FFFFFF(仮に)
だったとき明らかに値がずれてないか?そういう約束なのか?
char *a;
a = "ああ";
a = NULL;
a = "いいいい";
strcpy(a, "うううう");
>>175 悪いことは言わない。
ポインタのない言語に乗り換えてくれ。
>>175 なぜa=10 で &a=FFFFFFだと値がずれるんだ?
>>173 別に 172が間違いなわけじゃないが、あきらかに勉強不足なんだから、
文字の配列と文字列定数へのポインタとを混同すんじゃないよ。
174の strcpy()等も調べとく。
>>150 って、163,168 同様、厨ネタにしかならんのよ。
そんな不細工なソースを人に受け渡しするなら殴ってもいい。
(C++以前にデータや論理の抽象化云々…)
実際、157,160,161 あたりが、
>>できるだけ配列をポインタ扱いでコーディングするように努めてるが、
に何の意味があるか解説すると、もっと面白くなるかもしれないが。
156が何言ってるのかわからないのは俺だけですか
コマンドプロンプトで、コマンドライン引数を使ってプログラムを動かす
のですが、コマンドライン引数の最大長はどのくらいまでですか?
引数の文字列を5000byteくらい使いたいのですが、そんな長さでも正常に
プログラムに引数が渡りますか?
試したら渡ったようなのですが、毎回渡りますか?
環境依存
int i;
char c;
c = 0xff;
i = c << 24;
これ、gcc3でコンパイルするとi==0xff000000になりますが、
この結果は規格で保証されてますか?
保証されてないんじゃないの?
>>193 windows のコマンドプロンプトでしてますが、それ以外だとできないかも
ということですか。
日本語書いてるんだから
日本語を読んで理解できるだろ?
> 環境依存
環境に依存
わかる?
たとえばスタック容量不足で変数が消えるとか。賢くないコンパイラではへんなことになる。
>>194 Microsoftが仕様として明文化していなければ、同じマシンでも動いたり
動かなかったりするかもしれない。
Posixでは4096バイトまでは大丈夫なはずだが、コマンドプロンプトが
Posixに準拠しているかどうかは知らない。
>>191 int型が32ビットとは限らないんじゃないか?
>>200 自演か以前自分がそういう感じで答えられて腹立ってんでしょ
>>197 レスありがとうです。
さっきwindows 98で試してみましたが、116文字まででした。
windows xpだと4096バイトで試してもうまくいきました。
心配するくらいならファイルに記録したものを読み込ませればいいのに。
リダイレクトやパイプが使えるのならそれ使ってもいいし。
>>203 ファイルに記録してそれから読ませるようにしてみます。
Win98だと116文字か…MAX_PATH以下ってどうなんだろ…
>>198 すみません、こうでした。
long l;
char c;
c = 0xff;
l = c << 24;
<< 演算子の左オペランド c は char ですが、
この場合演算前に c が long に promote されることが
保証されているか、が気になっています。
staticしる
規格上保障されるかどうかより、現実の実装で確実性の高い手法を使うべし。
もちろん後から読んだときに誰でもわかるように、明示的にキャストしてやったほうがいい。
>>206 int型以下のサイズの整数演算は、すべてint型で行われる
「格上げ」あたりのキーワードでぐぐるといいかも
intのサイズは処理系依存。
intのビット幅以上のビットシフトの結果も処理系依存。
210 :
デフォルトの名無しさん:2005/08/11(木) 02:22:31
>>205 'FILENAME.EXT' (8 + 1 + 3 = 12)
116 + 12 = 128
PSPの制限が由来だな。
doskeyか何かとconfig.sysの設定で
2倍程度までは増やせた気もするが。
>>209 なるほど。この場合、intが16bitだとcharの24bit shift結果は
規格上ロストする可能性があるということになりますね。
>>208 そうですね。キャストすることにします。
>>182 何がどう厨ネタなのかわからんのだが。
心配するな、お前には受け渡ししないから。
そして、仕事しなくていいから。
>そんな不細工なソースを人に受け渡しするなら殴ってもいい。
それは自分自身のことにならないように気をつけることだな。
>に何の意味があるか解説すると、もっと面白くなるかもしれないが。
それを言うなら、何がどう厨ネタなのか「解説すると、もっと面白くなるかもしれないが。」
>>208 >規格上保障されるかどうかより、現実の実装で確実性の高い手法を使うべし。
規格上保証されているわけではないが、現実の実装で確実性が高いからその手法でも
まあいい、というのはわかるが、規格が保証されているものよりもあえて、規格は保証
されないが、現実の実装で確実性が高いものを推奨するという意味なのかな。
こんにちは
Win32には、::IsDBCSLeadByte(char byte)という、マルチバイト文字かどうかを確かめるAPIがあるのですが、
ANSIライブラリにこのAPIと同様の機能をするものがありますか?
Googleで調べたのですが、どうもHitしませんでした。
教えていただけると助かります。
よろしくお願いします。
ありません。
218 :
デフォルトの名無しさん:2005/08/11(木) 16:14:52
linux板の方がいいのかな。
gccなんですが、/usr/include/linuxの下のヘッダではなくて、
/home/hoge/work/include/linuxの下にあるヘッダを読ませたい
んですけど、どうすればいいんでしょう。C_INCLUDE_PATHを
/home/hoge/work/include:/usr/include
と設定してるんだけど、どうしても標準インクルードの方が
優先されちゃうみたいで。
素直に -I 使えよ
検索順序としては
-I > C_INCLUDE_PATHのような環境変数 > 標準ヘッダ
220 :
デフォルトの名無しさん:2005/08/11(木) 16:34:30
> 素直に -I 使えよ
-Iは複雑なMakefileの中なんで。環境変数指定の方が優先
されると俺も思ってるんだけどなあ。/usr/includeとかの
クリティカルなパスは特別扱いされてるとか。その辺の事情
知らない?
221 :
sage:2005/08/11(木) 16:41:54
>219
モノを頼んで悪いんだけどさ、今手元に環境あるんなら、
/home/hoge/work/include/linux/config.h:
#error "local"
main.c:
#include <linux/config.h>
main(){}
C_INCLUDE_PATH=/home/hoge/work/include gcc -c main.c
って試してみてくんない?
俺が阿呆なのかgccのblack magicに引っかかってるのか
切り分けたいんで。
お前らスレ違い過ぎですよ。
処で、-Iは複数指定できるんでないかい?
#include "lunix/config.h"
-nostdinc してみるとか
225 :
sage:2005/08/11(木) 17:37:02
やっぱスレ違いかの。だって「俺に聞け」って言うからさ。
ム板はめったに来ないので勝手が分からんでの。
> -nostdinc
なるほど、と試してみた。明示的に標準パスを付加してるはず
なんだけどなーんか微妙にエラーが出るんだよなー・・
ん?てことは/home/.../includeの方を読んでるってことかー?
てことは、阿呆なのはgccではなくやはり俺だったということかー?
ていうかよく見たらあげてるな、俺。
このスレでは、C言語自体の話題をするのであって、
Cコンパイラの実装の話は他のスレでやってくれ的なんだ
228 :
デフォルトの名無しさん:2005/08/11(木) 17:45:23
Cursesとかで現在カーソルのある座標を取得する関数とかありませんか?調べていますがなかなか見つからない
/home/の下読んでた。阿呆なのは俺だった。お騒がせ。
>>228 あんたもスレ違いですから。
cursesは専用スレがないから環境依存OKスレかUnixプログラミングスレ辺りかな。
231 :
デフォルトの名無しさん:2005/08/11(木) 17:58:52
>>230 スマソ、スレ違いでした。
CursesにはこだわっていないのですがC言語の標準関数では無理なんでしょうか?
>>231 誘導したんだから……
標準関数に座標を云々する関数がないことくらいすぐ判るだろ。
>>213,214
ふうむ、スレ違い相当の低脳厨がはりついてるのだけはよくわかった。
はいはい埋め埋め
C言語に限らないんだけど質問させて
テストの時、トレースするのめんどいからprintf文で値確かめようとしたら
ソースが汚くなるからやめろっていわれた。テスト終わったら消すっていったんだけど
めんどくさがらないでトレースしろ、といわれたんだけどこれって普通?
知りたい値が最初から決まってるんだからprintfでいいと思ったんだけど
わざわざデバッガでトレースするのめんどくせーし
>>236 GUIプログラムとかprintfで出力する先がないときもあるし。
>>236 たんなるprintfじゃ、確かに見難くなるかもな。
デバッグ出力用の専用ライブラリを使うなり作るなりしろ。
DBG_PRINT() とか DBG_MSG() みたいな用途がハッキリ分かるマクロなら、そんなに可読性を損なうこともない。
リリース時にはマクロでブランクに置換。
デバッガ用のマクロ/スクリプトを書くのが良い方法
と思ったが、その種の機能は使っているデバッガに有りや無しや
int n1;
n1 = 1 //* */ 2
;
if (n1)
printf("何で 0 にならないんだ?\n");
241 :
デフォルトの名無しさん:2005/08/12(金) 00:33:47
>>240 最近のCコンパイラはC++ コメントを理解するから //
以降がコメントとされて消えたと思われ。
なんでマジレス?
>>236 そもそも、テストの時始めからデバッガ使うなんて横着。
全関数全分岐、ステップ実行で目視確認するのかね。
近寄りたくないチームだ。
>>236 debugはマクロ使うな。
テスト後にデバック用printfの削除だと
消し忘れが発生するかもしれない。
出荷やソースコードのcvs管理等をやってない、
どーでも良いプログラムならprintfでも有りだけど。
マクロの消し忘れと、cvsの関係が分からん。
単に最初の一行はその後の文章と何の関係もない文章なのか?
下手だな。日本語。
消すのはもったいないなぁ。
起動パラメタなどでデバッグレベル調節できるようにすればリリースバージョンでも
デバッグメッセージ消さなくても済む。
まぁ、ASSERTとかTRACEとかのマクロ使うよな、大抵。
>debugはマクロ使うな。
この文は「俺はマクロを使うよ。」、「お前らはマクロを使ったらダメだ。」のどちらにも取れる。
>>245は、前者の意味で書いたと思うが、>>246- は、後者の意味で読んでいると思われ。
>>247の2行目に同意。
えーと、いまソケット通信を行うプログラムを作っています。
送受信ともにselect()を使って待機させているんですが、
CPU使用率が99%とかいってしまいます。
OSはRedHat9 2.4.20-6です。
で?
>>251 タイムアウト時間をきちんと設定してください。迷惑です。
selectの使い方を間違ってるんじゃないの?
selectから読み書き可能だと通知されたファイルを放置してるとか。
256 :
256:2005/08/12(金) 16:21:04
258 :
251:2005/08/12(金) 16:23:30
肝心の質問かいてないおれアホッス
CPU負荷率が高いのはselect()使ってたら、しょうがないんですか?
(タイムアウトなしです)
下がられるなら下げたいので、その方法もお願いします。
で、もしかして答えは
>>254だったり?
マニュアルよんだのか?
読んでないのなら読め
読んだのなら理解できてないからもっかい読め
あと、man select_tutの内容もチェックな。
つーか、スレ違いだがね。
>>260 解決しました、ありがとう。
ちなみに原因↓
SELECT の掟
10. タイムアウトの値は select を呼ぶたびに初期化すべきである。 OS に
よっ て は timeout 構造体を変更する場合があるからである。ただし
pselect は、自分の timeout 構造体を変更することはない。
日本語のマニュアルをよんでる時点で
こいつの程度が分かるな
264 :
デフォルトの名無しさん:2005/08/12(金) 18:50:46
>>263 その程度の事しか見ていないお前の程度も解かるよ。
>>263 Linuxユーザは基本的に日本語マニュアル読んでるな
MIKO GNYOユーザーの俺が来ましたよ
>>265 読んでないんじゃなくて読めないんだと思う
イベントとかいったら、たまにLinux使ってる人と話すことがあるけど
そのときになんか聞いたりすると、マニュアル見て英語だったら一瞬で閉じて
googleで日本語サイト限定にして検索する
めっちゃ古いのとか、gnuのじゃなかったりしてもお構い無しにそれを読んでた
ここで英語のマニュアル引用しても、読める奴がいないしな。
2chは日本人用の掲示板ですから
英語にかぶれた非国民は出て行け!
プ
正直、K&Rの「5.12 複雑な宣言」が理解できなかった。
char (*(*x[3])())[5];
ってなんだよ?こんな変態じみた宣言を普通に使ってるのか、おまえら?
俺は、宣言の意味さえ分からん・・・
必要だからそう宣言するだけ
意味が分かればそれが分かると思う
意味が分からないということは
それが必要でないって事
必要でなければ知る必要もないでしょ
そういうのはtypedefで分解してやるとわかりやすいかも
char を返す関数ポインタの配列の配列へのポインタ?
なんか戻り地の書き方が変なような。
お前ら真面で分からないのか・・・
ただの配列じゃん
何が分からないのか分からん
関数ポインタの配列と理解した
複雑すぎる宣言は使いみちはあまりない。
>>273 みたいなのは、、二段のディスパッチテーブルに分解したほうが使いかってがいい。
いや見ただけで分かるだろ
こう言うの、一瞬見ただけで分からないと、Cプログラマーを名乗ってはいけないのか?
むしろ解るやつはPerler
283 :
274:2005/08/12(金) 22:11:18
「配列へのポインタを返す」ってとこが分からんかった。
つか今でもピント来ないな。
char (*)[]
配列へのポインタだろ。これを返す関数は。どういうプロトタイプになるんだ?
char (*)f()[]
char (*f)()[]
うーん。
いけなくは無いと思うけど
charとキャストとポインタが分かってたら分かるだろ
それらを理解してたつもりで上を読んで理解できなかったのなら
理解できてなかった証拠でしょ
>>271を読み解くのは問題ないけど、
typedef どう使うのかわからん。
>>283 char (*)[]を返す関数はchar ((*)[])()。全体を括弧でくくって右に関数の括弧を付ける。
>>285 俺ならこうやる(型名が糞とか抜きね)
typedef char FIXEDSTRING5[5];
typedef FIXEDSTRING5 *LPFIXEDSTRING5;
以下略
>>285 つまり自分で書くソースにあんな宣言が必要になったら
>>287みたいにtypedefを使うということ。
既存のものを読み解くのに使えるわけではない。
>>285 typedef char (*Type_X)[5];//char型配列[5]のポインタ
typedef Type_X (*Type_FuncX)();//Type_Xを返す関数のポインタ
//検証用 これでコンパイラ通れば正解。
char (*(*x[3])())[5];
Type_FuncX lp = NULL;
x[0] = lp;
なんで、
char*[5] (*f[3])();
じゃないの?演算子の優先順位の問題?
ああそうか。悪い、スルーしてン。
関数ポインタが入った段階で typedef しちゃうへたれだけど、とりあえず
ttp://www.kouno.jp/home/c_faq/c1.html#21 char (*(*x[3])())[5]; を typedef 分解するとこんな感じだろうか。
typedef char A[5]; /* A = (*(*x[3])()) -> A *(*x[3])(); */
typedef A *B; /* B = (*x[3])() -> B (*x[3])(); */
typedef B C(); /* C = (*x[3]) -> C *x[3]; */
typedef C *D; /* D = x[3] -> D x[3]; */
D x[3];
あるいは
typedef A x[3]; /* typedef char (*(*A)())[5]; */
typedef B *A; /* typedef char (*B())[5]; */
typedef C B(); /* typedef char (*C)[5]; */
typedef D *C;
typedef char D[5];
>286
それだと、char 型を返す関数の配列へのポインタにならない?
char (*f())[5] じゃないか?関数ポインタの型だと char (*(*)())[5] かな。
293 :
デフォルトの名無しさん:2005/08/13(土) 22:11:48
コマンドラインからもらったargv[]がファイルなのかディレクトリなのか
判断するにはどうすればいいですか?
294 :
293:2005/08/13(土) 22:12:31
すいませんWinXPです。
>>293 argv[]は単なる文字列へのポインタ。
その文字列が、ファイル名かディレクトリ名か、
あるいは、その他の意味を持つ文字列かは、
コマンドラインで実行した本人以外は誰もわからん。
その文字列と同じ名前のファイルやディレクトリが
存在するか確認する方法はOS依存。
まあ、拡張子が付いていたらファイル、それ以外はディレクトリ、
ファイル名、ディレクトリ名に使用できない文字があったらエラーとか、
ファイルをオープンしにいって、成功したらファイル、それ以外はディレクトリとか、
そんな安易な実装でいいんだったら、純粋なCでも可能だけど。
>>296 そんな安易な実装について聞いているんだろ
OS依存といってもPOSIX準拠な方法があるんだから
もうstatでいいじゃん。面倒くさい。
やれやれだぜ
299 :
293:2005/08/13(土) 23:42:56
>>297 statをmsdnで調べて出来ました!
ありがとうございました。
>>296 決して安易という訳ではないんですが、
こういうシステム依存の部分て調べ辛くて…
文法とかアルゴリズムは良く見つかるんですけどね。
>>295 言いたいことはよく分かるのですが、
正直、1のリンクからは見つけられませんでした。
>>295みたいなのはマジであほというか、ナンセンス
>>296みたいなのは長々と書いてるだけで何の情報も無い
長文結構だが、その中にこっそり情報混ぜてやれよ
こういう
>>293みたいなやつにはヒントをあげるだけでいいんだよ。
問題はそのヒントのセンス。
ナンセンスとかヒントとか使う奴増えたなー
ヒントが増えたことは認めるがナンセンスは認めない
>296はダメダメだな。例えばa.txtなるディレクトリがあるやもしれん。
ううむ、夏の補講で残されてる数人だけが
俺だって勉強してると言わんばかりに
とくいげに無駄話ばかり続ける状態。
305 :
デフォルトの名無しさん:2005/08/14(日) 12:03:39
ファイルの内容を%x使わないで16進数に表示させたいのですが、どうやったらいいんでしょうか?
宿題は宿題スレへ
308 :
デフォルトの名無しさん:2005/08/14(日) 12:11:28
宿題スレにいきます
309 :
デフォルトの名無しさん:2005/08/14(日) 12:12:16
猫でもわかるC言語プログラミングという本を見ながら
勉強しようとしたんですが、わからない事があります。
Microsoft Visual C++ .NET にて
/*hello.c*/
#include <stdio.h>
int main()
{
printf(
"Hello ""World\n");
return 0;
}
というのをビルドしたんですが
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。
と、エラーが二つでます。 どうしたらいいのでしょうか?
設定があるのですか? それともソースを変えなきゃ行けないのでしょうか?
わかってないと思うけど、
>>309のしつもんは環境依存なんですよ
Windowsプログラミングのスレで聞いてくださいね
>>305 16で割った余りを調べて10-15をa-fに変換して配列に入れる
商が0になるまで続ける
配列を%sで出力
315 :
305:2005/08/14(日) 16:00:43
>>312 ありがとうございます。
ファイルからデータ読み込む方法はfgetcを使用してるんですが、
漢字が上手く取り込めません。16進数表示部が文字化けしてしまいます。
>>315 宿題スレでコードで解答もらってんじゃん
>>315 文字化け…?
fgetcの戻り値はただの整数だから化けることはないと思うけど。
言い忘れたけど配列の最後には必ずNULLを入れること。
rand関数によって出てくる数列ってOSに依存するんですか?
>OS
じゃなくてコンパイラ付属のライブラリ
(あれ?winな環境だとAPIとかでOSなのか?)
>>320 ないない。
UNIX系なら仮想ファイルで乱数取得が可能かも知れんけど
「「自分と同じシグネチャを持つ関数へのポインタ」を返す関数」へのポインタ型って定義できるんでしょうか?
typedef func_t (*func_t)(obj_t *obj);
func_t func1(obj_t *obj);
func_t func2(obj_t *obj);
func_t func3(obj_t *obj);
のように。(実際にはこうは書けない)
typedef void *(*func_t)(obj_t *obj);
void *func1(obj_t *obj);
...
こんな感じに書いて、あとは必要に応じてキャストすれば済むには済むんですが、気になったもので……。
>>322 できませんC++でtemplate使いなさい
交換・選択・挿入のソートプログラムを作って、試しに50000個の乱数をソートさせてみたのですが、
挿入ソートが他の2つよりも3倍以上早かったんですがそんなものなんでしょうか?
3つともO(n^2)とどこかでみたのですが
325 :
324:2005/08/14(日) 22:53:35
すいません。よく考えたらスレ違いですね
ある程度並んでいる状態での挿入ソートは
実は効率よく終わるように考慮されているロジックであれば一番速かったりする
>>326 こんな感じなのですが、これが基本形ですよね?
void bubble(int *d,int n)
{
int i,j;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--)
if(d[j]<d[j-1]) swap(d[j],d[j-1]);
}
}
void insert(int *d,int n)
{
int i,j;
for(i=1;i<n;i++){
int temp=d[i];
for(j=i;j>0 && d[j-1]>temp;j--)
d[j]=d[j-1];
d[j]=temp;
}
}
なんでスレ違いに得意げに無意味なレスだけ増やすやつらが沸いて出るんだ?
>>324 Oは問題の大きさに対して計算量がどう増加するかを表わすもので、
計算量そのものを表わすものじゃないし。
>324
たとえば昇順にソートしたいとき、降順にソート済みの入力でためしとけ
つーか、順次生成したデータをソートするケースなら挿入ソートが速いのは自明だ罠。
332 :
デフォルトの名無しさん:2005/08/15(月) 09:18:14
Cってもう時代遅れでC++・C#の方が良いって聞いたんですが本当ですか?
333 :
デフォルトの名無しさん:2005/08/15(月) 09:43:50
334 :
デフォルトの名無しさん:2005/08/15(月) 09:56:35
>333
そうですか
レス乙です
ヤッパリ老舗のCが良いんですか?
Cωが一番良いです。
336 :
デフォルトの名無しさん:2005/08/15(月) 10:03:39
ネタレス止めてくれぃ
337 :
デフォルトの名無しさん:2005/08/15(月) 10:06:28
スミマセン
ググったらマジで有りましたオメガですか・・・
もう、しょうがないなぁ、337は
でCが安定してて良いんですか?
安定させるのはプログラマ次第です。
プログラマの技量による
頼むからJavaに移ってくれ…という香具師もいる
342 :
デフォルトの名無しさん:2005/08/15(月) 10:33:25
Cが時代後れということはないのだが、PC 関係のプログラムを
なんでもかんでもCで作る時代は MS-DOS の時代に終った。
343 :
デフォルトの名無しさん:2005/08/15(月) 10:41:16
MS-DOS の時代の後半はメモリの上限が 640KB だった。EMSメモリを
付けてバンク切り替えで記憶容量は増やすことが出来たがそれでも数M
だった。CPUクロックも 16MHz, 33MHz, 66MHz など、MHz 単位で
3桁に満たなかった。そのような状態だったので当時あらゆる開発に
C言語を使うことは現実的な選択だったのだ。C言語であれば容量が小さく
高速なプログラムがアセンブラで組むよりはるかに楽に作れたからだ。
344 :
デフォルトの名無しさん:2005/08/15(月) 10:54:48
ミナサマ、レスありがとうございます
初心者はC++・C#よりCから始めた方が良いのでしょうか
ふつーC++。つーかそれ以前にスレ違い。
なんでも質問すれとか初心者歓迎C/C++スレとかあるだろ。
失礼
でも答えてくれて、あんがと
347 :
デフォルトの名無しさん:2005/08/15(月) 12:13:44
なんかこぉバァァァーみたいな
>>343 DOSでCが使われるようになったってのも、90年代に入ってからで、
それ以前はアセンブラが多かったとおもう。
>>348 TURBO PASCAL がかなり使われてた。その後はLattice C。
MSCが使われだしたのはWindows3.x以降、コンパイラがDPMIなしじゃまともに動かなかった。
でも、一太郎V3やLotus123、Mifesみたいなメジャーどころは皆MSCだったような覚えが。
VZがasmだったのは確かだけど。
日本じゃTurboPascalはブームになる前にしぼんだような。
すぐにTurboCをはじめ低価格Cコンパイラで、Cブームに。
>>351 TURBO PASCALが一番使われてたのはCP/MからMS-DOS2.11あたりの時代。
フロッピーディスクベースでエディタ+高速コンパイルが売りだった。
まだN88DISK-BASICと張り合ってた。
MS-DOS3,1まではMicrosoftもDOSの外部コマンドの作成などにLattice-Cを使ってた。
MS-Cが登場し、TurboCなどの低価格Cブームが来るのはこの後。
うるせえよじじいども
>>353 盂蘭盆会で地獄の釜が開いてるんだ、今日は大目に見てくれ。
じじいだろうと、厨はウザイ、スレ違いだ。
Cの初心者、宿題系に、軒並みバカがはりついてるみたいだからそこに帰れ。
356 :
デフォルトの名無しさん:2005/08/15(月) 21:00:56
#include <stdio.h>
int main(void)
{
float fbuff,ftmp;
int i;
for (i = 5;i <= 8;i++){
ftmp = 0;
switch(i){
case 5:
ftmp = 10 * i;
break;
case 6:
ftmp = 1 * i;
break;
case 7:
ftmp = 0.1 * i;
break;
case 8:
ftmp = 0.01 * i;
break;
}
if (i == 0){
fbuff = 0;
}
fbuff = fbuff + ftmp;
printf("ftmp = %f\n",ftmp);
printf("fbuff = %f ftmp = %f\n",fbuff,ftmp);
}
return 0;
}
実行結果が下記になる理由を教えて下さい。どうして「0.000003」多くなるのでしょうか?
fbuff = 56.780003 ftmp = 0.080000
ふ、ふろーと
>>356 一般的にfloatの精度は23ビット、即ち高々7桁しかない。
従って、有効なのはは56.78000までが関の山。
%fの代わりに%gを使うことで、誤差を余り見ないで済むかもしれない。
尤も、素直にdoubleを使っとけと言う話になるが。
359 :
356:2005/08/15(月) 21:22:01
360 :
デフォルトの名無しさん:2005/08/16(火) 10:54:11
お邪魔します。
ファイル内のバイナリの数字の羅列に対して、CSV処理するコマンドを作りたいです。
コマンドの引数として、別のファイルの定数一覧からCSVの区切り文字数を受け取って
処理させるものを作りたいと思っていますが、どう作っていけばいいのか分かりません。
どんな感じで作る物なのか、ヒントかもしくは
参考にしやすいサンプルソースを見れるサイトがあったら教えていただきたいです。
>>360 >ファイル内のバイナリの数字の羅列に対して、CSV処理するコマンドを作りたいです。
具体例をあげて何がしたいのか説明して。
エラトステネスのふるいのプログラムがわからないので質問させて下さい。
#include <stdio.h>
#defineN 1000 /* Nまでの素数を求める*/
#defineTRUE 1 /* 真:素数である */
#defineFALSE 0 /* 偽:素数でない */
charis_prime[ N+1 ]; /* 結果を格納する配列*/
int main( void )
{
int i, j;
/* 配列を初期化 */
for( i = 1; i <= N; i++ )
{
is_prime[ i ] = TRUE; /* 最初はすべて「素数」とする */
}
is_prime[ 1 ] = FALSE;
/* エラトステネスのふるい */
for( i = 2; i*i <= N; i++ )
if ( is_prime[ i ] )
for( j = i*2; j <= N; j += i )
is_prime[ j ] = FALSE; /* この倍数は「素数」でない */
/* 結果の出力 */
printf( "%dまでの素数は、\n", N );
for( i = 1; i <= N; i++ )
if ( is_prime[ i ] )
printf( "%d ", i );
return 0;
}
>>360 >>1読め。ここは「C言語」自身に関して、だから
プログラムの組み方、等は激しくスレ違い。
このソースのエラトステネスのふるいのfor文if文がわかりません。
最初のfor文のi*iの意味、次のif文に論理演算子がないこと、次のfor文のi*2の意味
がわかりません。
そこがわからないので結果の出力のfor文とif文もわからないです。
ネットでも調べたり本でも調べたんですけど、他のソースは別の書き方をしていて
そのやり方なら理解できるのですが、このソースはちょっとわからないのでよろしくお願いします。
>>362 >最初の for の i*i の意味
ある数の約数の片方は必ず平方根以下であるから。
逆に考えると、約数( = i )の2乗が合成数以下。
>次の if 文に論理演算子がない
C の条件判断は、0 以外で真。
つまり、#define された TRUE が入ってれば真になる。
そもそも C には本当の意味での bool 型がないから整数で代用してる。
>その次の for の i*2 の意味
さらにその次の行のコメントのとおり、
素数の *2 *3 *4 …を約数でないとするため、
i*2 i*3 i*4…の数列を作るための for 文。
こんな感じでどうよ?
>最初の for の i*i の意味
ある数の約数の片方は必ず平方根以下であるから。
逆に考えると、約数( = i )の2乗が合成数以下。
これはわかりました。
>、#define された TRUE が入ってれば真になる。
そもそも C には本当の意味での bool 型がないから整数で代用してる。
if文のis_prime[i]が整数で代用してるってことですか?ここら辺がちょっとわからないんですけど。
s_prime[i]は確かに整数・・・ああ、なんとなくわかってきた気がします。
s_prime[i]の要素の整数とif文の条件判断で使う1,0の整数と整数は二つありますね。
1,0の整数のことですね。ただif ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。
何かの省略なんでしょうか?
>素数の *2 *3 *4 …を約数でないとするため、
i*2 i*3 i*4…の数列を作るための for 文。
i*2の2がわからないです。jがカウントアップしていきますよね。
そのときに2が変数でカウントアップしていかないと常に2の倍数になってしまうと思うのですが、
すぐ答えていただきありがとうございます。できればもうちょっとだけ上記のヒントを下さい。
>if ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。
つ[if文の定義]
368 :
365:2005/08/16(火) 14:14:47
>>366 >if ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。
if 文は 真/偽 を判断する、と考えてるとそういう思考に陥ります。
まず定義として if 文は、条件として与えるものは整数で、「0 か否か」を「偽 or 真」として判断します。
そして、!= とか == などの演算子は、0 かそれ以外の値をとる整数値になります。
よって、 たとえば (12 == 13) という条件文は「偽」ではなく 0 という "整数" をとります。
>そのときに2が変数でカウントアップしていかないと常に2の倍数になってしまうと思う
2が変数ってどういうことでしょうか?
for( j = i*2; j <= N; j += i )
i*2 は最初の j の値で、二週目以降 i ずつ増えます。
つまり、i*2、i*2+i、i*2+i+i、…となるわけで、i*2 i*3 i*4…となるわけです。
唐突なんですが、構造体のポインタを返す関数があったらそのポインタの指すメモリ領域は
いつ開放されるのでしょうか。
関数の中で新たにヒープに割り当てて、そのアドレスを返したりしているのだったら、
あとでfreeなどで開放してやらないとマズイと思うのですが、
標準関数のlocaltimeなんかはそんなことしませんし。
その辺の解説してもらえるとありがたいです。
ヒープに割り当ててないから。
>>369 libc の localtime は、static な構造体へのポインタを返したり、
内部で自動確保&終了時に自動破棄しています。
そのため、受け取ったポインタを明示的に破棄する必要はありません。
ただし、前者はマルチスレッドの時に問題を引き起こす可能性がある
( 排他処理すればいいけどね ) ので、あまりおすすめはされない手法です。
そんなわけで生存期間は実装依存になるため、
あまり離れると移植性の点で問題になるかもしれません。
すぐに手元のローカル変数などにコピーするのがベターです。
ちなみに自分で関数を書く場合には、
struct tm *localtime_r(const time_t *timep, struct tm *result);
この result 引数のように、バッファを渡してもらう形にすると
余計なことを考えなくて済むのでベストです。
372 :
369:2005/08/16(火) 16:09:02
>>370 回答ありがとう。
書き方が悪くてすみません。
localtimeは開放しない関数の例として挙げました。
一般に内部しようの分からない関数だったり、自分で作ったりしたときの当該問題における
寿命についての質問です。
373 :
369:2005/08/16(火) 16:16:29
>>373 その例がマズイと思えるなら特に言及する必要はなさそうね。
>>371 の最後に書いてあるように、特に何か事情がない限りは
バッファは呼び出し側が用意するのが一番いいかな。
new で確保して free() で解放するようなバグをなくすためにも。
どうしても関数内でメモリを確保しなきゃならないときは、
malloc で確保したら free、new で確保したら delete・・・
というルールを忠実に守ればOK。
>>373 fopen()とfclose()みたいに、リソースを確保する関数と開放する関数を作って、
必ず両方呼び出してくださいとすればいいと思う。
(直接「free()を呼び出して下さい」でもいいと思うけど)
そのリンク先は、引数は値渡しなんだから、リターンも値で返せばいいのにな。
>>374-375 よくわかりました。
そのルールを徹底します。
丁寧な解説ありがとうございました。
>>373の例・・・なんでマズイんか教えてください。。
夏厨で申し訳ないんですが・・・orz
>>377 変数 st のスコープが関数 p_output() 内に限られてるため、
st のメモリ領域は関数を抜けた時点で無効になる。
だから main() でこのポインタの先にアクセスしちゃだめ。
例はたまたまうまく逝くだけ。以下のように変えると良く分かるかも。
#include<stdio.h>
struct st_samp{
int x;
int y;
int z;
};
struct st_samp *p_output(struct st_samp st);
int main()
{
struct st_samp s1={2,3,0}, s2={4,5,0};
struct st_samp *p_st;
p_st = p_output(s1);
p_output(s2);
printf("%d * %d = %d\n",p_st->x,p_st->y,p_st->z);
return 0;
}
struct st_samp *p_output(struct st_samp st)
{
st.z = st.x * st.y;
return &st;
}
C++スレで質問してしまったので、こちらへ移動させて下さい
a_positionの位置から、配列の後>前へとhoge処理を行いたいのですが
これをfor文だけで綺麗に記述することは可能でしょうか
if( a_position == 0 )
hoge( *array );
else
for( int i = a_position; i >= 0; --i ) hoge( array[i] );
for( int i = a_position; i >= 0; --i ) hoge( array[i] );
これで何が問題?
381の回答がすぐ出ないC++スレの連中は一体
383 :
380:2005/08/16(火) 19:13:05
>>381 申し訳ないです、仰るとおりっす
これと間違えていました…
if( a_position == 0 )
hoge( *array );
else
for( unsigned long i = a_position; i >= 0; --i ) hoge( array[i] );
384 :
380:2005/08/16(火) 19:19:55
すいません、
>>383もバグありです
要するに符号無しでの綺麗なループの話だったのですが、ぐだぐだなので出直してきます
添え字にunsignedを使いたいなら
for( unsigned long i = a_position+1;i--;)hoge( array[i] );
386 :
380:2005/08/16(火) 19:27:45
これで解決できました…こんな事でスレ汚しすいません
unsigned long a_position = 0;
do{
hoge( array[i] );
}while( array_pos-- != 0 );
と、思ったら
>>385さんのスマートなレスが!
やっぱり聞いて良かった、ありがとうございました。
ループは前置って刷り込みが駄目でした orz
unsigned long a_position = 0;
do{
hoge( array[a_position] );
}while( a_position-- != 0 );
もう寝よう…
ほんとうに(なんで) unsigned long の範囲じゃないといけないのか?
含めて意味ないしすべてスレ違いだと思う。
>>385 境界条件 a_position = ULONG_MAX のふるまいは無視なのか?
389 :
360:2005/08/16(火) 21:01:21
>>361 具体的に言うとファイル内に
「1234567890」
等の数字(バイナリ)が入っていて、
また別のファイルに
「3,4,3」
のように数字が入っていて、
これを
「123,4567,890」
に変える処理でう。
>>Cでプログラムを作るのですが、
Cの仕様に関する質問じゃないとダメでしょうか?
390 :
360:2005/08/16(火) 21:02:30
↑すみません抜けてました。
下段のは「
>>363」です。
391 :
385:2005/08/16(火) 21:08:29
>>388 a_position = ULONG_MAX のときは、
array の配列長が ULONG_MAX より大きいということになるから無視ということで。
無視してもそんな馬鹿でかい配列は滅多に無いですし、実用上は問題ないでしょう。
一応それも回避するなら
>>386(の間違いを直したやつ)で
unsigned long i = a_position;
do hoge(array[i]);while(i-- != 0);
>>360 バイナリを連呼しているが、「バイナリ」と「区切り文字数」という二つの単語は矛盾しているよ。
ファイルには単に十進数字文字が入っているだけだろ
393 :
360:2005/08/16(火) 21:11:58
>>392 すみません、ちょっと抜けてました。
元のファイルはバイナリで、
それをテキストファイルに、特定の箇所に「,」を入れて出力する感じになります。
>>393 そのバイナリファイルには何が入ってるんだ?入ってるのは文字では
ないわけだからカンマ区切りも何もないわけだが。
397 :
360=389=393:2005/08/16(火) 21:21:28
>>397 なってない。数"字"とバイナリデータを一緒にするな。
>>389,360
ソース丸投げだか初心者向きかに逝け、と言われとるんだよ。
質問さえきちんとできてないだろ? ヒント程度では手も足も出ないだろ?
>>394 マヌケは質問者の補助にもならないから黙ってろ。
400 :
360=389=393:2005/08/16(火) 21:28:37
了解しました。
初心者向き、もしくはソース丸投げスレを探してみます。
お騒がせして申し訳ありませんでした。
>>360の言いたいのは
要するにバイナリダンプだろ。単にスペースがカンマになっただけで
[offset]: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
----------------------------------------------------------------------------
00000000: 4D,5A,90,00,03,00,00,00,04,00,00,00,FF,FF,00,00 MZ・........��..
00000010: B8,00,00,00,00,00,00,00,40,00,00,00,00,00,00,00 ク.......@.......
00000020: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ................
402 :
360:2005/08/16(火) 22:55:23
>>401 フォローしていただいてありがたい所ですが、自分でもよく分かりません。
先日見た設定書では、
ファイルの中の先頭から**バイトにAの情報、次の**バイトにBの情報、・・・
というようなことが書かれていたと記憶しています。
また、「ダンプ」という言葉もチラッと耳にした覚えがあります。
教えを請うには色々と情報が足りなかったようです。
>>368 >そして、!= とか == などの演算子は、0 かそれ以外の値をとる整数値になります。
>よって、 たとえば (12 == 13) という条件文は「偽」ではなく 0 という "整数" をとります。
比較演算子は0か1を返してくるよ。
a = ( x > 0 ) ? ( 1 ) : ( 0 );
は
a = x > 0;
と同じ。
見辛いからあまりお勧めはしないけど。
>>404,405
?
比較演算子は0か1しか返さないって言いたいだけだよ。
0かそれ以外の整数を返すって
>>368に書いてあるじゃん。
>>406 ならば次の順序で書くべきだな。
a = x > 0;
は
a = ( x > 0 ) ? ( 1 ) : ( 0 );
と同じ。
>>404==405==407?
結局何が言いたいの?
409 :
デフォルトの名無しさん:2005/08/16(火) 23:43:40
初歩的な質問で申し訳ないのですが
変数の初期化について質問です
unsigned int x=0;
x++;
こんなプログラムを書いたとすると
延々 xが0になっちゃいますよね
一回だけ初期化して 二回目は無視みたいなことは簡単にできないのでしょうか?
>>409 unsigned int x=0;
x++;
こんなプログラムを書くとx==1になるが?
static unsigned int x=0;
しかしわかりにくい日本語と情報量だな、
>>409糞ガキ
比較演算子の演算結果って真偽じゃないの?
0と-1の可能性もあると思ったけど
>>402,360
>フォローしていただいてありがたい所ですが、自分でもよく分かりません。
まともに質問できないどころか、設計、仕様さえ理解してなかったわけね。
いいかげん腹たってくるな。ここでそんな告白しないで、挨拶して誘導して、
あっちでちゃんととりさげるのが筋じゃあるまいか? (あやまれとまで言わんが)
ttp://pc8.2ch.net/test/read.cgi/tech/1121644782/433 >教えを請うには色々と情報が足りなかったようです。
まあ、仕事がらみなら会社ん中でちゃんと解決しろよ。
もともとほんとにこの程度の話なら、基礎応用に過ぎないので、
解説やらヒントも何も、アドバイスしようが無いほどなので。
>>412 ISO/IEC 9899:1999の6.5.8 -6と6.5.9 -3によれば、Relational operatorsも
Equality operatorsも共に結果は0と1で、その型はintだそうな。
C言語の本 買ったは良いけれど
他に アルゴリズムの本買えば
C言語のプログラムは作れる様になるの?
>>411 413
それでやったけど 延々1のままです
日本語が使えないなら該当コード晒せよ
もうグローバル変数でも使ってください。
int main(int aaa char* aaa[])
{
static unsigned int c=0;
c++;
Printf("%d",c);
}
省略するとこんな感じですかね
>>420 まさか起動する度に数字を変化させたいのか?
だったらファイルに書き出すしかない。
爆笑スマソ
>>420 何がしたいのかハッキリ書かんと
どうしようもないよ
おそらく
>>421の書いたとおりのことじゃないのか
426 :
デフォルトの名無しさん:2005/08/17(水) 00:58:05
そうか、いけたんか。
なんか、もやもやする。
>>427 と思ったらいけてないかもorz
pspの自作プログラムのソースをいじってるところなんです
int main(int aaa char* aaa[])
{
static unsigned int c=0;
c++;
Printf("%d",c);
main(aaa,aaa)
}
。
>>429 えぇっと、何がしたいんですかぇ?
先ず、何でもいいからC言語の本買ってきて
読みましょう。
あっ、ついでに言うと
メチャクチャです。
432 :
420:2005/08/17(水) 02:00:05
ありゃ ここ IDでないのか
>>430 429は僕じゃないです
じゃあ再帰でどうよ?みたいなネタでしょ。
>>409が再帰を理解しているとは思えんし。
>>432 そっそうですか。
でも、先ず本読んでください。
(・3・)
>>436 (・3・)エェー ちみも出て行けYO!
438 :
377:2005/08/17(水) 14:02:29
初歩的な質問ですが、
固定文字列をソースの中に持たせる時、
1) #define FIXED_STRING "hogehoge"
2) static const char* FIXED_STRING[] = "hogehoge";
と2種類の方法がありますが、両者に違いはあるのでしょうか?
違うのだとしたら、どういう場合で使い分ければよいのでしょうか?
「こういうときはこうする」、「俺はこうしてる」等
意見があったら教えてください。
>>439 前者は後者より古い流儀。
後者は前者よりプログラムサイズが小さくなるけど、
それ以外の違いは開発時に感じた事はないな。
>>439 static const char* FIXED_STRING[] = "hogehoge";
これは構文ネラーになるはず
>>439 static const char FIXED_STRING[] = "hogehoge";
か
static const char* FIXED_STRING = "hogehoge";
ですね。一般的にマクロはデバッグしにくくなりますね。今回の場合は
関係ないかもしれませんが。
>442の前者は配列なので長さをsizeof(FIXED_STRING)-1で得られる代わりに、
複数の関数内で利用すると実体が複数作られる。
後者は長さが得られないが実体は複数作られない(かもしれない)。
Cの場合、マクロで充分な気もするのだが。
const 変数て、Cだと定数扱いにならないんじゃなかたっけ?
配列サイズの指定で使えない。
char[]だとコンパイル時に連結できない
マクロならできる
447 :
デフォルトの名無しさん:2005/08/17(水) 21:46:32 BE:149769465-
>>440 staticにしてるってことは、インクルードファイルにでも書いておいて、
それぞれのファイルで、インクルードするような使い方を想定してるっぽいから、
ファイルサイズは小さくはならないと思う。
グローバル変数にすればいい
(^^)
>>445>>446 #define INI_FILE_DIR "../config"
#define INI_FILE_NAME "foo.ini"
fopen(INI_FILE_DIR "/" INI_FILE_NAME, "r");
とか?
別にいいじゃん。
マクロなら#ifdefできる。
正直、マクロは結構見辛い。
ただ、セミコロンを打たなくていいのは結構うれしい。
セミコロンうたないとオートインデントがおかしくなるんですよ。
10人の身長デ-タ(data)を背の高い順に並べ換えた後打ち出すプログラムです。正しく動くように虫を取って下さい。
#include<stdio.h>
#define num=10;
int i;
double data[num]={ 173.8,168.2,180.3,166.0,189.7,167.4,159.8,170.5,167.5,167.4};
int main(void)
{
for(i=1;i<=num;i++){
int j,max=i;
for(j=i+1;j<=num;j++) /*最大の要素の場所を捜す*/
if (data[max]<data[j]) max=j;
data[i]=data[max];
data[max]=data[i]; /*入れ換え*/
}
for(i=1;i<=num;i++) printf("%7.1f ",data[i]);
return 0;
}
int main(void)
{
int i,j,l;
for(i=0;i<num;i++){
for(j=i+1;j<num;j++){
if(data[i]<data[j]){
l=data[i];data[i]=data[j];data[j]=l;
}
}
}
for(i=0;i<num;i++) printf("%7.1f ",data[i]);
return 0;
}
>>456 スレ違い。
宿題なら宿題スレへ、そうでないなら初心者スレ辺りへ。
defineとconst話じゃねのか? >458
460 :
458:2005/08/19(金) 08:41:12
>>459 defineの文法までここで教える必要はないと思うが。
二つの構造体の宣言が別々のインクルードファイルに書かれてて、
それぞれの構造体がもう一方の構造体を要素として持ちたい時、
どうやればいいんでしょう?下のだとニワトリと卵になってしまうし・・。
----- aaa.h -----
#include "bbb.h"
typedef struct {
BBB *b;
}AAA;
---- bbb.h ----
#include "aaa.h"
typedef struct {
AAA *a;
}BBB;
typedef struct A A;
typedef struct B B;
struct A { B* b; };
struct B { A* a; };
>>462 別々のファイルで宣言すること自体がおかしいってこと?
>>461 -----t0.h
#ifndef t0_h
#define t0_h
#include "t1.h"
struct a {
struct b *b;
};
typedef struct a a;
#endif
-----t1.h
#ifndef t1_h
#define t1_h
#include "t0.h"
struct b {
struct a *a;
};
typedef struct b b;
#endif
scanf関数を使用し、コマンドラインからの数字を10回入力し、
入力の中でもっとも大きな数字を表示しなさい。
※入力桁数のエラーについて対処する事
という課題が出されたのですが、入力桁数のエラーがよく分かりません。
誰か教えていただけないでしょうか?
>>465 どういうエラーなのかが分からないとなんとも。
468 :
465:2005/08/19(金) 12:55:12
>>466 先ほどのが課題文の全文なので私にもよく分かっていないのですが、
おそらくは型が扱う数字を超えて入力した場合、
たとえば、int型なら32,767より大きい数字を入力した場合に認識されないことについて対処する
ということだと思います。
>>468 そう考えた、ということでコード組めばいいんじゃない?
あと、intの場合は環境によってサイズが違うので注意。
・sizeofでバイト数をチェックして上限を計算
・今の環境に合わせて、とりあえず決め打ち
など、方法はいろいろあるので試してみ。
(独り言)
学校の課題ってのは結果をただ提出するだけじゃないんだよ。
不明点、疑問点があったら提出前に質問しに行ってもいいんだし。
全く分からない、何がわからないのかわからない」ってのは論外だけど。
470 :
465:2005/08/19(金) 13:37:53
つーか、宿題スレがあるんだからそっちでやれよ。
>>472 まあ、宿題○投げじゃないから
いいんでないの?
473 :
465:2005/08/19(金) 14:00:55
えっと、これ学校の宿題とは違うのですよ。
ですから、宿題スレで質問するのも気が引けてしまいまして(苦笑)
474 :
デフォルトの名無しさん:2005/08/19(金) 14:15:39
int a,b;
double c;
a = 10;
b = 1000;
c = a / b ;
printf("c = %f",c);
結果 c = 0.000000となってしまうのはなぜでしょうか?
c = (double)a / (double)b ;
476 :
デフォルトの名無しさん:2005/08/19(金) 14:30:09
>>475 ありがとうございました。
もうひとつすみません。
int a,b,d;
double c;
a = 5
b = 5;
d = 1000;
c = (a + b) /d ;
printf("c = %f",c);
この結果がc = 0.000000となりますが
int a,b,d;
double c;
a = 5
b = 5;
d = 1000;
c = a + b ;
c = c / d;
printf("c = %f",c);
この結果がc = 0.01となるのはどうしてでしょうか?
すみませんが教えてください。
>>469 > ・sizeofでバイト数をチェックして上限を計算
これってintの最大値のことを言ってるの?
だったらINT_MAXを使うのが定跡だと思うけど。
質問です。
Cでファイルからデータを読み出すとき、「1行(次の\nまで)を読み込む」ってどうしてます?
fgetc で1文字ずつ読み込んで \n かどうか判定して・・・ってやるしかないでしょうか。
まさか fscanf とか使うのもあれだし。
スクリプトファイルを読み込むときなどに使います。
479 :
デフォルトの名無しさん:2005/08/19(金) 14:33:58
>>478 fgets関数っていうのがありますよ。
>>479 fgets 調べてみました
・・・今までの苦労は・・・orz ありがとございました。
>>478 一行はかならず*Kバイト以下とか、そういう仕様で割り切れば、fgets()で簡単に書けると思う。
>>476 >c = (a+b)/d;
(a+b)もdもint型だから、int型の(a+b)/dがdouble型に型変換されてcに代入される。
>c = c / d;
cがdouble型だからdがdouble型に暗黙的に型変換されてdouble型のc/dが計算される。
その結果がcに代入される。
もう少し型について勉強しとけ。
484 :
デフォルトの名無しさん:2005/08/19(金) 14:38:18
>476
前者の場合、
c = (a + b) /d の右辺はすべて整数値
後者の場合、
c = a + b ;
の時点だと右辺は整数値だが
c = c / d;
ではcがdoubleのため実数値となる
前者の場合でも、aかbをdoubleでキャストすれば
後者と同じ結果になる
486 :
デフォルトの名無しさん:2005/08/19(金) 14:40:44
>>485 本当にすいません。ありがとうございました。
487 :
デフォルトの名無しさん:2005/08/19(金) 20:08:24
FILE型の変数(ポインタ)からint型の整数(ファイルデスクリプタ?)
を得るのってどうすればいいのですか?
>>487 VC なら _fileno 関数が。非標準ね。
stdio.h を読んで構造体メンバから引張ってくるとか。
互換性に問題あるけど。
>>487 Unix 系なら int fileno(FILE *stream) てなものが...
strcpy、sprintfとか使って、char型にしてから、
atoiとかstrgetvalue()とか使えないもんかな
492 :
デフォルトの名無しさん:2005/08/19(金) 23:24:55
UNIX系C言語のコンパイルで汎用で使えるMAKEFILEを作りたいんだけど、
何か良い参考書とか
サンプル(オプションなどのコメントアウト付)とかないですかね?
>>492 スレ違い。
Unixプログラミングスレ、makeスレ、書籍スレなどへどうぞ。
495 :
464:2005/08/20(土) 01:40:36
>>461==467
あんたに宿題
>>464 のコードから #include 行を削除しても問題がない事を確認し,
なぜ #include 行がなくても問題ないのか述べよ.
----- aaa.h -----
typedef struct AAA_{
struct BBB_ *b;
}AAA;
---- bbb.h ----
typedef struct BBB_{
struct AAA_ *a;
}BBB
ってかんじ?
ちなみにstructはtypedefしない方がぱっと見分かりやすいぞ
497 :
デフォルトの名無しさん:2005/08/20(土) 10:58:01
>491
(w)sprintfてのは、int→char変換の為に、て意味でも存在してるぞ
char a;
int b;
(w)sprintf(&a,"%d",b);
>>497 '\0'の分を用意していないからだめだろ。snprintf/swprintf
/* 約数があるかどうか調べる */
is_prime = 1
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;
これはどうゆう計算が行われてますか?
教えて下さい。。。
>>499 誰が書いたんだ?
i=i+1じゃなくてi++でいいのに
>>499 is_primeがフラグになってる。('0'なら非素数、'1'なら素数)
2<=i<=num/2の範囲でiをインクリメントして、逐次numをiで割り切れるか調べる。
ちなみに、
・iの初期値が2なのは、1で割るのを避けるため。
・ループ継続条件がi<=num/2なのは、余計なループをさせないため
まあ一回でも割り切れたらis_primeに'1'が入るから、
約数を調べたいだけなら
if((num%i)==0) {
is_prime = 0;
break;
}
の方がいいと思う
503 :
デフォルトの名無しさん:2005/08/20(土) 17:28:33
今どきのコンパイラは for の条件に i<=num/2 とか書いても速いのかな・・・。
昔々 for (i = 0; i < strlen(s); i++) というのを書いたやつが居て衝撃を受けたことのある俺だが。
公園の便所には阿部さんがいて危険だから自宅のトイレでいいじゃん
>>503 VS2003のVC++で確認したら、ループの外で num / 2の処理をしてるみたい。
507 :
499:2005/08/20(土) 18:54:22
>>502 ありがとう!なかなか理解できなくて困ってた。
508 :
デフォルトの名無しさん:2005/08/21(日) 00:23:54
すみません。教えてください。
本当に基本的なことなのですが。
staticで関数外に構造体などの領域を宣言しても
いきなりその構造体が使える(=メモリが割り当てられる)
わけではないのでしょうか?
そこにアクセスしようとすると、
アクセスバイオレーションが発生します。。。。
>>508 正しいコードなら
>>509のとおりなのであなたのコードに問題があるとしか考えられません。
というわけでソースコードを晒してみて下さい。
511 :
508:2005/08/21(日) 00:44:02
すみません。言葉不足でした。
例えば、staticで構造体を宣言します。
typedef struct aa
{
int i;
char *p;
}AA;
static宣言された領域は0初期化されてしまいますので、
pももちろん0になっています。
pはアドレスしか保存されませんよね。
ということは、
どこかにpの実体用メモリ領域が必要になってくるってことなんでしょうか?
512 :
508:2005/08/21(日) 00:53:23
すみません。ソース晒した方がよさそうですね。
typedef struct a{
unsigned long aa;
int bb;
}addr;
typedef struct info{
int id;
a *addr;
char *host;
}table_info;
#define MAX_SIZE 2
static table_info table[MAX_SIZE];
int main(int argc, char* argv[])
{int i;
for(i=0;i<MAX_SIZE;i++)
{
table[i].id=-1;
table[i].addr->aa=0;←ここでエラー
table[i].host=NULL;
}
return 0;
}
staticで0クリアされてるので、0番地にアクセスしようとして
エラーになってるのはわかったのですが
これを回避する方法がわかりません。。。。
よろしくおねがいいたします!
回避する方法というか、addrは何のための変数?
514 :
508:2005/08/21(日) 00:59:52
あ。変な宣言になってますね。
上の構造体のtypedefしたaddrは必要ありません。
2番目の構造体で、構造体のアドレスを使いたいのです。
typedef struct info{
int id;
a addr;
char *host;
}table_info;
>>514 その構造体は何の構造体? struct infoとライフサイクルに違いはある?
何対何の関係?
517 :
508:2005/08/21(日) 01:11:19
>>516 上の構造体は、本来なら既に別ファイルで定義されているものなのです。
それを呼び出す形で、2番目の構造体で使いたいとおもっています。
そんなことは聞いてない。
ポインタを理解していない模様
構造体以前の問題だな
522 :
508:2005/08/21(日) 01:20:34
>>515の宣言で、呼び出しができるのですか?
そうですね。ポインタを理解してないのが敗因のようです。
勉強してきます。
大変ありがとうございました!
523 :
515:2005/08/21(日) 01:21:19
typedef struct info{
int id;
addr a;
char *host;
}table_info;
こうだな。
終わったところで恐縮だけど、「呼び出す形」とか「呼び出しができる」とか
どういう意味なんだろ???
ほかで定義しているものを使うってだけだろな。
ただこいつの理解レベルじゃ、定義と宣言のつかいわけも怪しいから、よくわからん。
下記のようにバイナリモードで開いたファイルのサイズ(Byte)を得ようとしたのですが、うまくいきません。
fp++がマズいのでしょうか?
for(i=0;feof(fp)==0;i++){
fp++;
}
>>526 そうです。FILE*をインクリメントしてどうする。
>>527 あ、考えてみるとポインタだったんですね。
つまり*fp++とすればいいのですか?
fp はファイル内の位置そのものではない。
ファイル内の位置は、FILE構造体のメンバに隠されている。
移動させたかったら、FILE*を引数に取る、目的に見合ったを関数を使え
>>530 さらに構造体だったんですね。。。勉強になりました。
こんな感じですか?
fseek(fp,1,SEEK_CUR)
532 :
531:2005/08/21(日) 02:13:37
第二引数がlong型ということで1Lに修正してみましたが、正常に動作しませんでしたorz
おしいな・・・
>>532 それ以前にファイルサイズの取得は標準の範囲内では出来ない。
環境依存の方法を使うしかない。
ケツに移動させてみい
536 :
531:2005/08/21(日) 02:20:54
>>535さんの言うようにしても正常に動作しなかったので、
ループ内にprintf("%d ",i);と入れて確認しましたが、無限ループになってるようです。
環境依存だったんですね。。スレ違いすいませんでした。。。
代替策とかないですかね?
こんな感じでどうよ。
#include <stdio.h>
int filelen(const char *filename, const char *mode)
{
int len = 0;
FILE *fp = fopen(filename, mode);
if( fp == NULL ) return -1;
while(fgetc(fp) != EOF ) ++len;
return len;
}
ちなみに
>>531が思い通りにうごかないのは環境依存云々ではなく、fseekの意味を取り違えている。
>>537 ありがとうございます。
ですが上手く動作せず、デタラメな数字がでてしまいます。
バイナリモードだからでしょうか?
それとも私の組み込み方が悪いのかもしれませんが。。。
>fseekの意味を取り違えている。
教えていただけませんか?
ほんとにケツに移動したのか?
feek(fp, 0L, SEEK_END);
size=ftell(fp);
いや、おれはいつもstatで取得するけど
540 :
531:2005/08/21(日) 02:48:52
>>539 おお、こんな方法があるんですね。
ありがとうございます。
541 :
デフォルトの名無しさん:2005/08/21(日) 07:31:13
今まで一つのファイルでプログラミングを行って来たのですが
複数のファイルにコードを書く場合はどのようなことをするのですか?
また、リンクとはどういったいみなのでしょうか?
542 :
デフォルトの名無しさん:2005/08/21(日) 07:32:56
普通の入門書には書いてないだろ
main.cに
#include "sub1.c"
#include "sub2.c"
とか書けばOK
>>543 俺は普通の入門書読んだが、一通りは書いてあったぞ
まぁ今読んでるK&Rに書いてあるのには及ばないが
>>545 モジュール化した方がいいと思うが・・・
>>545 pthread-winのソースみたいになっとるな
549 :
デフォルトの名無しさん:2005/08/21(日) 13:10:17
>>545 .c を include するのはあまりおすすめな方法じゃないな。
それでも可能だけど一つのファイルを修正しただけでも
全てのコンパイルをしなければならなくなって効率が悪い。
普通は型やプロトタイプ宣言や#defineをヘッダファイルに
まとめておいてそれを使うソースでincludeする。
複数のソースファイルをコンパイル・リンクするだけなんじゃないか。
>>550 多分ヘッダファイルを書けないんだろう。
リンクってどうするの?
553 :
デフォルトの名無しさん:2005/08/21(日) 16:44:44
負けファイル作んないと。
D:\databox>bcc32 main_kansu_file.c sonota_cfile.c kison_objfile.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main_kansu_file.c:
sonota_cfile.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
555 :
デフォルトの名無しさん :2005/08/21(日) 17:37:13
1 + x/1! + x^2/2! + x^3/3! +・・・・+x^r/r!
をとくプログラム
xとrをきくかたち
教えてください(>Д<)
嫌。
>>555 それはまず式を簡単にしてからやれよ
そのまま計算するバカはいないよ
プログラミングより先に数学を勉強しなさい
x^r/r! = x^(r-1)/(r-1)! * ???????
559 :
デフォルトの名無しさん:2005/08/21(日) 19:34:27
ソースをダウンロードしたら
.o, .lo, .la, .am, .in
というファイルがあるのですがこれはなんでしょうか?
ではまず駄弁るだけの
>>560さんが移動してください
563 :
デフォルトの名無しさん:2005/08/21(日) 20:00:55
階乗と累乗教えてください
新しめのC規格で、オーバーロードってできるのですか?
>>555 脳内コンパイル注意
#include <stdio.h>
#include <math.h>
int fact(int n)
{
int ret=1,i;
for(i=2;i<=n;i++)ret*=i;
return ret;
}
double func(double x,int r)
{
double ret=1.f,t;
int i;
for(i=1;i<=r;i++)
{
t=pow(x,i);
t/=(double)fact(i);
ret+=t;
}
return ret;
}
int main()
{
double x;
int r;
printf("x,r= ");
scanf("%lf,%d",&x,&r);
printf("Ans= %lf",func(x,r));
return 0;
}
567 :
デフォルトの名無しさん:2005/08/21(日) 20:27:32
char *hoge = NULL;
int *hogo = 0;
となっているのですが、
NULLと0は何が違うのですか?
FAQ参照。
はぁ?
書き込むんなら答えをかけよ糞が
#define NULL 0
571 :
デフォルトの名無しさん:2005/08/21(日) 20:42:56
mallocでメモリを確保してそれを全て0にしたいのですが
forで回す以外の方法は無いのでしょうか?
calloc
memset
forで回すのなんて本当にやってるやついるの?
なんで、mallocはゴミつめたままで、callocはZeroFillなんだろうな?
575 :
デフォルトの名無しさん:2005/08/21(日) 20:51:50
566さん
ありがとう!!!!
>>574 常にZeroFillする必要は無いけど、
必要な時には効率よくZerofillしたいからじゃない?
mallocは絶対にゼロで埋める必要がないといいたいのだろうか。情報少なすぎて意味分からん。
少なくとも
>>571には必要なようだが。
580 :
579:2005/08/21(日) 20:57:49
あ、その使い分けが出来るように、変えてあるということか。
>>579 自前でfor回したり、後でmemsetするよりも効率よくZerofillすることが
可能かもしれない。
582 :
579:2005/08/21(日) 21:00:37
でも、calocとmallocは本来目的が違う関数なのに、そういう設計はなんだかな。
だったらmallocにZeroFillフラグつけるとか、mallocZとかいう別関数で用意するほうが分かりやすいのに。
ここは阿呆連中ばっかりか?
そんなもん、なんで"printf"があるのに"puts"があるのですか
っていってるようなもん
そりゃそうだな
ごめん
585 :
デフォルトの名無しさん:2005/08/21(日) 21:42:16
1 + 1/r^2 + 1/r^2 +・・・・+1/r^n
rとnを聞いて
と求めるプログラム
>>583 おまえ、その二つは用途が完全に違うだろ。
だからなに?
用途が違うのに一緒のように使おうとするっていう例では丁度いいじゃん
589 :
デフォルトの名無しさん:2005/08/21(日) 22:15:01
int this_option_optind = optind ? optind : 1;
と言うのがあるのですが = の後ろからの意味が分かりません
どのような意味なのでしょうか?
自分で調べろ
ヒント:三項演算子
煽りすらまともに出来ないのかよ。
それだけじゃ、何言ってるのかわからん。
static struct hoge hoge_hoge[] =
{
{"hoge1", 1, 0, 'a'},
{"hoge2", 1, 0, 'a'},
{"hoge3", 1, 0, 'a'}
};
のようなコードがあるのですが、
なぜhogeとhoge_hogeを二つの変数を宣言しているのですか?
597 :
569:2005/08/21(日) 22:48:44
>>595 帰れって言われてもここは自宅ですよ?
あなたが現実とネット上の世界の区別が付かないといわれている人ですか?
>>594 「struct hoge」型の変数hoge_hogeの宣言。
それが何か?
必死だな
>>589 条件演算子
そのコードの意味としてはこんな感じ。
int this_option_optind;
if (optind != 0)
this_option_optind = optind;
else
this_option_optind = 1;
604 :
デフォルトの名無しさん:2005/08/21(日) 22:56:31
static hogeをループで回したときは、なぜ多重宣言にならないんですか?
>>604 たとえ何回ループされようとソースコード上ではたった1箇所でしか定義がなされていないから。
見苦しいのは595だと思う
>>606 一度目のループで宣言され
二度目のループで2回目は宣言されないのですか?
>>604 悪いが言ってる意味が分からん
具体例を挙げてくれ
>>608 だから1回目とか2回目と考えるのがナンセンス。
プログラムの実行するとき、ソース上でstatic変数の宣言している箇所を通ったらその変数が用意されるというわけではない。
コンパイル時にコンパイラがstatic変数を見つけたらその時点で領域を確保しておく。
実行時にはただ確保された箇所をstatic変数として使うだけ。実行時には宣言なんてどこにも残っていない。
while(1){
static int hoge = 0;
hoge++;
}
これだと何度もhogeが宣言されると思うのですが
>>611 static の意味調べてね
べーた臭がする・・・
>>611 プログラムの実行時に静的変数の宣言は実行されるものではない。
予め場所だけ用意しておき、静的変数を参照するときにはいつでもそこを見に行くだけ。
while(1){
static int hoge = 0;
hoge++;
}
は
static int hoge = 0;
void foo()
{
while(1){
hoge++;
}
}
とほぼ同じ。違いはブロックの外からは直接参照できないこと。
617 :
597:2005/08/21(日) 23:17:00
>>598 なんであなたは自分の意見を共有したがるのですか?
自分で意見があるのなら他人まで巻き込まないで自分で実行しましょうよ
>>616 いますよ
そんなこと聞いてどうするんですか?
私の経験から行くと、「友達いるのか?」って聞く人のほうが
友達がいないような気がするんですけど
いい加減C言語と関係ないこと書き込むのやめれば?
構って君を構うやつが一番悪い。
>>617 そうか、いるのか。
ふーん。では、ここではそういう現実とネット上の世界の区別を付けてるわけか。
>>621は 宣言子でいうと auto あたりかな
>>617 >なんであなたは自分の意見を共有したがるのですか?
あなたも
>>569 の意見を共有できるものならしてみたらどうですか?
624 :
デフォルトの名無しさん:2005/08/21(日) 23:45:33
>>567 NULL = ヌルポインタ
プロセスが0ということだ
int *a =0
は
int* a;
a = 0;
でポインタaにプロセス0を渡してる
>>619 お前らって・・・
俺書き込んでなかったんだけど。
まあいいけどさ。
627 :
社長:2005/08/22(月) 00:45:47
"\x35\x39\x37"
解雇
>>567 そもそもchar型ポインタにNULLのファイルポインタを代入している時点で
ファイルはクラッシュします.
NULLは0ではありません.
631 :
人事部:2005/08/22(月) 02:22:37
社員番号 0x255の方、あなたに解雇処分が決定しました。
632 :
デフォルトの名無しさん:2005/08/22(月) 02:26:36
>>629 あれ? そうだったっけ? それは保障されてなかったっけ?
633 :
デフォルトの名無しさん:2005/08/22(月) 02:32:06
634 :
629:2005/08/22(月) 02:52:43
ごめんなさい,根本的なところを間違えていました.
fopen()で(FILE *)を返すのでFILEという構造体を返すものだと勘違いをしていました......
友達はいても会社クビになる見苦しい人、何で恥の上塗りしてるんですか?
>>631 >あなたに解雇処分が決定しました
日本語で話してください。
お部屋をお連れします
あなたは、可愛い子です
いきなり大きなコピペでごめんなさい.
次の共用体を使ってshort型で入れた整数を
long型に変換するように作ったのですがどうしてもコメント行のような結果になりません.
どこかまずかったのかどなたかご指摘をお願いします....
/* int型をlong型に変換するプログラム */
#include <stdio.h>
union int_long {
short i;
long j;
} itl;
int main(void)
{
itl.j = 0L;
itl.i = 1024;
printf("%ld", itl.j);
// 00000100 00000000 00000000 00000000 = 67108864
return 0;
}
>>643 Windowsの話なら
union int_long {
short i[2];
long j;
} itl;
にして、
itl.i[1] = 1024;
とすることでコメント行の結果になる。
キーワードはhighとlow
646 :
デフォルトの名無しさん:2005/08/22(月) 18:08:30
>>643 内部で Big endian (上位桁が下位アドレスに入る形式) で数値を扱っている
マシンならお望み通りになる。Little endian (下位桁が下位アドレスに入る
形式) のマシンの場合は正の整数の値の場合 short を long に入れても値に
変化はない。図にするとこうだ。
上位addr 下位addr
00000000 00000000 00000100 00000000
|-------------- long -------------|
|------short-----|
ずれているかも知れないが脳内で修正しろ。
そんなエサに俺様が
ずれまくりw
紛らわしい書き方だなぁ。
実際にメモリに置いた状態との対比とかしないと。
650 :
643:2005/08/22(月) 19:18:10
お返事ありがとうございます.
>>645,
>>646 さんの通りにやったら思ったとおりの値が出ました.
あと,混乱するようなソースを作ってしまったのでこれも出来ればお願いします.
pak |-[7] [6] ....... [2] [1] [0]----|
double |---------------d---------------------|のように捉えたのですが考え方は間違ってますか?
union {
double d;
char pak[sizeof(double)];
} _ddat;
int i;
FILE *fp;
_ddat.d = 1283648236.434532;
if((fp = fopen("double", "wb+")) == NULL) {
printf("ファイル展開に失敗.");
exit(1);
}
for(i=sizeof(double); i; i--)
fwrite(&_ddat.pak[i-1], sizeof(char), 1, fp);
fclose(fp);
_ddat.d = 0.0;
if((fp = fopen("double", "rb")) == NULL) {
printf("ファイル展開に失敗.");
exit(1);
}
fread(&_ddat.d, sizeof(double), 1, fp);
fclose(fp);
なんか中庭ででけえ音楽鳴らして車に乗ってるカスがいるな
雰囲気を感じ取ってもらえれば良いのですが、
#define OUTPUTNum1(fname,id1) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d" ,id1 );\
fclose( test );\
}
#define OUTPUTNum2(fname,id1,id2) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d %d" ,id1, id2 );\
fclose( test );\
}
#define OUTPUTNum3(fname,id1, id2, id3) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d %d %d" ,id1, id2, id3 );\
fclose( test );\
}
こんな感じの、可変長の引数にうまく対応するマクロ、
もっと簡潔にかけませんか?
広い中庭ですね。
654 :
651:2005/08/22(月) 19:30:02
スレッドミス.....orz
スレ違いスマソ
>>652 用途は違うかもしれないが、参考までに。
-- hoge.h --
#define _OUTPUT_FLAG
#ifdef _OUTPUT_FLAG
extern void _OutputNum( const char *format, ...);
#define OUTPUT_NUM(...) _OutputNum(__VA_ARGS__)
#else
#define OUTPUT_NUM(...) ((void)0)
#endif //_OUTPUT_FLAG
-- hoge.c --
#include "hoge.h"
#ifdef _OUTPUT_FLAG
#include <stdio.h>
#include <stdarg.h>
void _OutputNum( const char *format, ...)
{
va_list args;
char buf[256];
FILE* fp = fopen( "unko.txt", "w" );
va_start(args, format);
vfprintf(fp, format, args);
va_end(args);
fclose(fp);
}
#endif //_OUTPUT_FLAG
656 :
652:2005/08/22(月) 20:38:08
↑のように書くことで、OUTPUT_NUMマクロはprintfと同じ書式で
unko.txtに出力できるようになる。
また、_OUTPUT_FLAGの定義をコメントアウトすることで、
ソース中のOUTPUT_NUM()があっても出力を抑止できる。
まさかこれほどすばらしい答えが得られるとは、
正直思っとりませんでした
さすが2ちゃん・・・
>>656さま本当にありがとうございました
658 :
656:2005/08/22(月) 20:48:46
今更ながら
>>656の名前間違えてたorz
>>656 =
>>655ね
なんで質問者になってるんだよ俺www
ちなみに、↑のはVCのTRACEマクロと同じやり方ね。
659 :
650:2005/08/22(月) 21:42:05
すみません.よく考えてみたのですが
union {
short sht;
char ch[4];
long lng;
} test;
でポインタのアドレスを求めたら,
|--sht--|
|------lng------|
|--ch[0].......ch[3]--|
のようなアドレス分布になったのですが,このshtとlngを考えたら
どう考えてもlngの左端のビットにshtを介して1は入らないと思うのですが,実際は入ります.
>>646さんのように
|--sht--|
|------lng------|
|--ch[3].......ch[0]--|
と考えるのでしょうか?double型のデータを一旦,共用体の配列メンバchから適当なファイルに保存して,double dとして読み込むと考えると以下のように
考えれば読み込めば正常な値が得られるのですが,
|------------------------double d--------------------------|
|-----ch[0]-----ch[1]---.............................----------------ch[7]----|
ひとたび,
|------------------------double d--------------------------|
|-----ch[7]-----ch[6]---.............................----------------ch[0]----|
と考えてやるとdouble dの値は意味のない値となってしまいます.
かなり混乱してしまって何がどうなっているのかよく,掴めません.どうか,お願いします.(´・ω・`)
>>659 ビックエンディアンとリトルエンディアンは調べた?
どう考えても...入るんじゃないのか?
662 :
デフォルトの名無しさん:2005/08/22(月) 22:05:28
ググッたら IntelのCPUなのでリトルエンディアンを採用しているようです.
下位ビットから転送されるということは例えば,
ch[0] の値が100,ch[1] の値が120 としたとき二進数表記がそれぞれ 01100100,01111000
となっているとしたらメモリのビットの並びは
00100110 || 00011110
となっているということでしょうか?
>>659 #include <stdio.h>
void dump(void *data, int size)
{
unsigned char *p = data;
int i;
for(i = 0; i < size; ++i) printf("%02X ", p[i]);
putchar('\n');
}
union {
short sht;
char ch[4];
long lng;
} u_test;
int main()
{
printf("ofset: 00 01 02 03\n------------------\n");
u_test.sht = 0x1234;
printf("sht : "); dump(&u_test, sizeof(u_test));
u_test.lng = 0x12345678;
printf("lng : "); dump(&u_test, sizeof(u_test));
return 0;
}
664 :
659:2005/08/22(月) 22:12:39
なんか、バイナリ入出力だ endianだ、似たようなバカ
なこと聞いてくるのが沸いて出るなあ。
>>643,650
>>共用体を使ってshort型で入れた整数をlong型に変換
そもそも bit操作を(言われてもendianも理解しないで)
こういう方法でやるのが間違い。
というか、スレ違いは相手にするなと。
初心者系かなあ。少なくとも実用プログラムじゃないよなあ。
(もともとその処理自体意味無いんじゃね? 会社の、とか言い出したりして……)
666 :
デフォルトの名無しさん:2005/08/22(月) 22:26:24
某所より
#include <stdio.h>
int sum(int,int);/* プロトタイプ宣言 */
int main(void)
{
int value;
value = sum(50,100);
printf("%d\n",value);
return 0;
}
int sum(int min,int max)
{
int num;
num = (min + max) * (max - min + 1) / 2;
return num;
}
return numはどこに返り?
return numでなくreturn 0ではだめなんですか?
659,662 のあほさ加減は、ネタなんだよな!?
>>666 return 0でもいいけど、それじゃ何のためにsum()呼んでるの?
671 :
デフォルトの名無しさん:2005/08/22(月) 22:32:15
いや、わかりません。。
解説おねがいできますか?
672 :
659:2005/08/22(月) 22:33:19
ネタではないです......
独習C の練習問題でどうしても解答のやっていることが理解できなくて質問させていただきました.
スレ違い,失礼いたしました.
>>672 ちょっと待って。それこそ初心者系じゃないか、とか、
endianとかは他の書籍も参考にきちんと調べろよ、とか
は置いといて…
その「独習C の練習問題」というのは一般の書籍のことなのか?
スレ違いだがいちおう最後に晒してくれ。
(書籍にきちんと解説があるはずの場合もあるし、例題、書籍自体が
トンデモナイ場合があるので…)
そもそも
return numとreturn 0
の違いが分かりません。。
厨質すんません。。
そういうのは先生に聞いてくれ
>>673 「独習C 第三版・Herbert Schildt著・翔泳社」です.
すでに改訂版が出ているようですが.....
事前に代入処理の型変換についての解説はありました.
>>674 厨質にもほどがある。
まずはまともに本で自習してくれないか。
今日からC言語を勉強し始めたばかりのものです。
ぶっちゃけ、
int a=1;
・・・・
とかからどうやってドラクエとか作るんでしょうか?めちゃめちゃ不思議です。
>>677 いや、ネタだろういくらなんでも・・・
とりあえず676が本気でやる気あるのなら、
トリップつけて(自分でくぐれよ)初心者スレへどうぞ...
>>678 戦闘のダメージとかはただの計算式だし
表示は画面を構成する二次元の点々に色付けるだけだし。
まずはマルバツでも作ってみたら。
ユーザーの入力、計算、画面の出力という意味でドラクエと変わらんw
俺にはプログラムでドラクエが動くことよりも、ドット絵師の技術の方が不思議に見える。
684 :
人事部:2005/08/22(月) 23:20:22
社員番号:0x0255の方、次の職探しで大変ですね。
受けた会社から聞き合わせの電話が来たら、しっかりとあなたの問題行動を伝えておきますので。
ヒットアンドブローはお手軽に作れてそれなりに遊べて、
プログラムの練習に超おすすめ。
聞き合わせ?
>>676 お手数です。続けるべきじゃないですがチト引っかかるので…
「代入処理の型変換」って「代入文での型変換」ということですよね。
そもそも、
>>643 >>共用体を使ってshort型で入れた整数をlong型に変換
にある例を、いわゆる"型変換"と呼ぶ(考える)のは誤解のもと
でしょうから注意。(強いて言えば byte(or bit)列の操作かなあ?)
その本も見たこと無いんで十分な説明があるのか良否はわかりませんが、
入門者に誤解を与えかねないのは危険かも。
どちらにせよ学習者が1冊だけを参考にするのは不備でしょう。
688 :
デフォルトの名無しさん:2005/08/23(火) 09:43:34
プログラムの一部を//や/**/等でコメントにすることをなんと言いますか?
コメントアウト
691 :
デフォルトの名無しさん:2005/08/23(火) 09:46:09
>>689-690 ありがとう
では、コメントアウトした部分をもとに戻すことはなんと言いますか?
あまり使わないような気もするけど
encomment/decomment
コメントアウトを戻す
コメントイン
お前マジ頭いいな
普通だって。
# なんだ、この流れは。
697 :
デフォルトの名無しさん:2005/08/23(火) 23:21:52
>>691 uncomment out
オプションを設定するヘッダーファイルのなかでこんなの良く見るよ。
/* uncomment out the following line to enable XXX */
/* #define OPTION_XXX_ENABLED 1 */
リストへの挿入がまったくワカラン
だれか分かり易く教えてくれない?
>>698 リストって線形リストか?
とりあえず新たに挿入するノードようの領域をmallocなりcallocなりで確保して
こいつへのポインタをnewにでも放り込んでおく
んで、挿入位置の直前にあるノード(A)の次のノードへのポインタをnewの次へのポインタに複写
その後、Aの次へのポインタをnewへのポインタに書き換えて終了
>>698 A→Cの間にBを挿入するなら、BにCをつないで(B→C)、AにBを
つなげば(A→B)いい。
具体的にstruct list {struct list *next;};みたいな単純な線形リストなら、
CへのポインタをBのnextに入れて、BへのポインタをAのnextに代入する。
口--→■⇒
◆を挿入
口→◆♂■⇒
702 :
698:2005/08/24(水) 00:25:47
簡単な挿入をおこなってるプログラム書いてほしいって言ったら…駄目?
よんでもいまいちワカランのよ
今読んでるの葬ってソースの載ってる本探せよ。
持ってる本はリスト関連がのってなくて…
単方向リスト?
双方向リスト?
708 :
デフォルトの名無しさん:2005/08/24(水) 03:37:56
すいません、質問です
char * GetStr ()
{
char _szTemp[128];
strcpy(_szTemp, "abc");
return _szTemp;
}
int main ()
{
cout << GetStr() << endl;
return 0;
}
GetStr()関数で char 型に入ってる文字列を返したいのですが、
どうすればいいんでしょうか。
void GetStr(char *_szTemp)
みたいに引数に入れて返すのではなく、
戻り値で返したいんです。
どなたかお願いします m(__)m
char * GetStr (char *_szTemp)
{
strcpy(_szTemp, "abc");
return _szTemp;
}
710 :
708:2005/08/24(水) 03:45:23
>>709 にゃるほど。それで行けますね。
どうもありがとうございます。 m(__)m
GetStr()で宣言した文字列を返したほうがスマートになるような
気がするんですが、それは無理ですか?
>>710 std::string GetStr()
{
std::string str("abc");
return str;
}
/* 俺も暇だなぁ */
typedef struct ulist ulist;
struct ulist {
int value;
ulist *next;
};
ulist *ulist_create() {
ulist *res = malloc(sizeof (ulist));
res->value = 0;
res->next = NULL;
}
void ulist_insert_next(ulist *prev, ulist *node) {
node->next = prev->next;
prev->next = node;
}
void ulist_remove_next(ulist *node) {
ulist *next = node->next;
if(next == NULL) { return; }
node->next = next->next;
free(next);
}
void ulist_free(ulist *node) {
ulist *next;
if(node == NULL) { return; }
next = node->next;
free(node);
ulist_free(next);
}
>>710 char *GetStr()
{
return "abc";
}
>>710 動的に確保していいんなら
char *GetStr() {
return strdup("abc");
}
きちんと後で free すること。
あと、静的なデータならそのまま return できる。
char *GetStr() {
return "abc";
}
char *GetStr() {
static char _szTemp[128];
strcpy(_szTemp, "abc");
return _szTemp;
}
ただ、静的なので当然データは同時に1つしか存在できない。
呼び出すたびに違うのを返したい場合には使えない。
ただまあ、普通は
>>709 の形にするんじゃない?
715 :
708:2005/08/24(水) 04:00:55
全然スマートじゃないんですが、
char * GetStr ()
{
char *_szTemp = "wertyuytrewruyreertyurertyuiitrertyuytre";
strcpy(_szTemp, "abc");
return _szTemp;
}
↑がいけるかと思ったら無理でしたww
>>711 >>713 >>714 std::stringはまだわからないので、
>>709か、できたら
>>713で行って見ます。
皆様、どうもありがとうございます。
>>715 Cの初歩の初歩で学ぶ禁じ手をやっている。
一冊Cのテキストを読むことをお勧めする。
そんな調子じゃ、まともなものは作れない。
>>715 そもそも文字定数って書き換え不可じゃなかったっけ?
つ
>>1 だから、無能厨が初心者と雑談するスレじゃないちゅうに。
アロー演算子が a->pnext->pnext とか2つ以上続いちゃうと
なんとなく不安になるんですが、考えられるまずい要素とかありますか?
>>720 >考えられるまずい要素とかありますか
あんたの頭。
あんたのあたま
>>720 演算子の優先順位をあたまにたたきこんでくだちい
a->pnext が何度も出てくる場合は効率悪いってくらいか。
最適化効くかもしれんけど。
>>720 tmp = a->pnext;
tmp->pnext
でいいだろ。
まずいというか、ポインタ参照は出来るだけ深くしないように習慣づけた方が良い。
****pとか論外。
簡単な事を複雑に見せてるだけでハッタリと変わらん。
リストの二つ先を拾うだけなら別にa->pnext->pnextでいいじゃん。
流石に五つも先ならa->pnext->pnext->pnext->pnext->pnextはやりすぎだと思うけど。
729 :
デフォルトの名無しさん:2005/08/24(水) 13:25:53
>>720 途中のポインタが NULL になっていた時に落ちる。
void abc( void ) {
int in;
printf( "kyoumoiitennki\n" );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void def( void ) {
int in;
printf( "kyoumoiitennki\n" );
printf( "sentakumonowohosou\n" );// point!
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
例えが少し悪いかもしれませんが、このように、ほとんど同じ関数なのに、
中途半端な位置で、一部だけ違うという場合にたまに遭遇します。
マクロ化して省略すると見づらくなりますし、どう回避すべきでしょうか
気にせず違う関数として2つ定義しておくのが、やはり一番の正解ですか?
void f( int mode ) {
int in;
printf( "kyoumoiitennki\n" );
if(mode==1)printf( "sentakumonowohosou\n" );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc()
{
f(0);
}
void def()
{
f(1);
}
732 :
デフォルトの名無しさん:2005/08/24(水) 14:28:32
>>730 コピペしてちょっと変えるだけの手抜きは決して許してはならない。
俺がそういう関数が数百ある他人の書いたプログラムのデバッグで
どれだけ苦労していると思ってるんだ。ふざけるな。
は?
>>731のを横から勝手に改造。
enum action {
NO_ACTION;
SOUJI;
HOSU;
NERU;
};
void f( action mode ) {
int in;
printf( "kyoumoiitennki\n" );
if(mode==HOSU)printf( "sentakumonowohosou\n" );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc()
{
f(NO_ACTION);
}
void def()
{
f(HOSU);
}
文字列を直接渡す方がマシ
void f( char *prompt ) {
int in;
printf( "kyoumoiitennki\n" );
if ( prompt[0] ) printf( prompt );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc()
{
f( "sentakumonowohosou\n" );
}
void def()
{
f( "" );
}
トリッキーな解としては関数ポインタを渡すとか。
void f( void(*callback)() )
{
int in;
printf( "kyoumoiitennki\n" );
if( callback ) callback();
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc( void ) {
f(NULL);
}
void def( void ) {
struct SFunc {
static void Callback() {
printf( "sentakumonowohosou\n" );
}
};
f(SFunc::Callback);
}
こう言う場合一行追加される if 文を気にしていた
自分が阿呆であると知ったいい機会でした
皆様レスありがとう!
>>735 >if ( prompt[0] ) printf( prompt );
こういうコードはやめて欲しい。
せめて
if ( prompt != NULL )
とかにしてくれ。
ぬるぽが来たらどうすんだ。
>>735 の場合は、ifを省略して、
printf( prompt ); だけでいいような気が。
ダメすぎ。NULLはprintf()に使えない。
厳密にやるなら、
if (prompt) {printf("%s", prompt);}
でないと%を含む文字列を表示できない。。
話が完全に反れてるな
>>735と同じスタンスだが
個人的には文字列は1つにまとめた方が好き。
#define HARE "kyoumoiitennki\n"
#define HOSU "sentakumonowohosou\n"
void f(char* msg)
{
int in;
if(msg)
printf( "%s", msg );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc( void ) {
f(HARE);
}
void def( void ) {
f(HARE HOSU);
}
>>742 printf( RAKKI "%d" ,in );
とはしないの?w
>>740 プロンプトがなしの場合、NULLを渡すか、長さが0の文字列を
渡すかって仕様の問題じゃん。
NULLを渡さないって仕様ならifはいらないって話。
うーん、こういう質問てここでいいのかな。より適切なスレがあれば誘導よろしこ。
Cで自作アプリを書き始めたのですが、(1)「できるだけ小さく」
(2)「他のライブラリに依存しない」を目指したら、標準Cがあまりにも
プリミティブ過ぎて、再発明した(しかも出来の良くない)「車輪」が量産
されつつあります。(メモリ管理とか文字列とかリストとかマップとか)
さすがにやってられないので、(2)はあきらめて、できあいの「車輪」を
使おうとしてるのですが、皆さんこういうとき何を使ってますか?
とりあえずライセンスのぬるいaprを使おうかと思ってるのですが……。
ちなみに、C++には宗教上の理由で近付きたくないです(ぉ
# いや、単に挫折しただけなんですが(^^;
ちいさくする意味がわからん
C++ を better C として使えばいい。
あとSTLも必要だな。
大丈夫、STLはオブジェクト指向じゃないから。
>>746 初めてC++をさわったとき、Hello worldのバイナリが数MBになったのが未だにトラウマだったりしまつ。
>>747 >>748 オブジェクト指向に挫折したんじゃなくて、C++に挫折しました。JavaやRubyには挫折しなかったんですが……。
>>749 今、VC7.1で試してみたけど、Hello, worldに目いっぱいの最適化をかけて48KiBになったよ。
しかしSTLを使わないのは惜しいな。
お前が例に挙げた文字列とかリストとかマップとかはみな含まれている。
ここはアンチ野郎がC++を使ってくれるように説得してあげるスレじゃありませんから。
それもそうだな。
そっとしておこうか。
754 :
ESP:2005/08/24(水) 23:30:00
それでいいだろ。何を求めてるんだよ。
ビットマップは絵の一番下のデータが一番最初にくるという逆転構造になってるから、
そこだけ注意な。
756 :
753:2005/08/24(水) 23:59:08
>>754 >>755 ありがとうございます。
C言語プログラムは初めてなのですごく緊張してます・・・
またお世話になるかもしれませんので、そのときはよろしくお願いしますm(_ _)m
あと、グレースケールならパレットになってるかもな。
>>753 画像編集ツールでxpmとかpgmを出力できるのを探してこい。
例えばIrfanView(プラグインも必要かな)でもいい。
bmpファイルをそのツールで開き、pgmの場合はOptionでAsciiに設定の上、
保存すればほぼ目的に到達できるぞ。
#自分でプログラミングする場合でも一度見ておくといいと思う。
759 :
753:2005/08/25(木) 00:22:32
>>757 いちおうカラー画像として保存してるんですが、
確認するようにします。
>>758 あ・・・ できちゃいましたw
まぁ、練習ということで組めそうならがんばってみます。
ありがとうございました。
>>745 過去に作ったプログラムから使えそうなものを拾って繋ぐ。
質問です!
printf();でバイナリをそのまま出力させたいんですがどう指定すればいいんですか?
あえてASCIIに変換したくないんですが・・・
print("%c",0xff);とすると、Dosプロンプトに出力された時のメモリ上にffと格納されるんでしょうか?
おねがいします。
>>761 バイナリをそのままってどういうことだ?
バイナリエディタで表示されるような感じのを出したいのか?
763 :
デフォルトの名無しさん:2005/08/25(木) 01:57:53
まずは、入門書から読み直せ
「そのまま」の定義がよー分からんが、
%02X みたいなことを意味しているんだろうか。
>>761 一つの方法としては
char ch=0xff;
int i;
for(i=128; i>0; i/=2)
if(i & ch) printf("1 ");
else printf("0 ");
他にはビットフィールドと共用体を利用する等
でいいのかな
レスありがとうです。
なんというか、バイナリをprintfで出力する必要があって・・・
0xffなら0x66,0x66ではなく0xffのまま出力させたいんです。
どうすればいいんでしょう?
ひょっとして
char a[2];
a[0]=0xff;
a[1]=0;
printf("%s",a);
とかでいいんでしょうか・・・
「バイナリ」が何なのか、
printf がどういう関数なのか、
全く分かってないように思われる。
>>766 それだと文字列が表示されると思いますが。
しかも妙な。
printfに拘る必要がわからない。
fwriteでいいのではないか。
print "\xff\xff"
これで普通にできるが・・・
こいつは何を言ってるんだ?
>>766 言いたいことは
printf("0x%x", 0xff);
ですか?
リダイレクトしてファイルにしたときに、
0xff(文字ではなく数値)で埋められたバイナリファイルができてほしいってことか?
深まる謎
>>771 それは、%sとかのパターンが入ったときに嫌な予感。
778 :
766:2005/08/25(木) 02:27:19
>770
対象がファイルじゃないんです・・
>771
perlですか?参考にします!
>772
ASCIIじゃだめなんです
>773
そうです。
何故かprintfを介さないと相手は受け取ってくれなくて・・
ASCII文字では無く数値そのままを渡したいんですが・・
うう・・入門書から出直してきます・・orz
ここまで阿呆だとカポーンだな
>>778 > 対象がファイルじゃないんです・・
stdoutファイルへ出力すれば?
リダイレクトなんかしないでFILEポインタ宣言して素直にfputc()かfwrite()を使ったらどうですか?
fprintf()もprintf()も最終的にテキストになるから無理ですよ。
>>766 例えば、0x41を出力したときどんな風に表示させたいのかね?
"A"?それとも"0x41"?
用語の統一が大切だって良く分かった。
つまり、最初の %c でいいんじゃないのか?
putchar でもいいと思うが。
>>784 それだと文字に変換されたのが出るんじゃなかったっけ?
まぁどっちにしろ766の言ってることはいろいろとおかしいが
>>785 単に1バイトそのまま出力するだけなんだが?
ディスプレイに出力すれば文字として表示されるだけであって。
それは分かってても言わない約束よ
言わなきゃいけないことだよ馬鹿
ど、どーぶる。
質問はともかくスレ違いなアホなレスする奴はどっか逝け。
>Dosプロンプトに出力された時「のメモリ上に」ffと格納されるんでしょうか?
>何故かprintfを介さないと相手は受け取ってくれなくて・・
あたりで、意思の疎通が無理なのは自明。
かなりスレ違いな気もするがどこで聞いたらいいか分からないので
dx/dt = -10*x + 10*y
dy/dt = 28*x - y - x*z
dz/dt = -8/3*z + xy
をオイラー法で解く場合の式って以下でいいのでしょうか?
for(i=0; i<last; i++){
x[i+1] = x[i] + h * dxdt(x[i], y[i]);
y[i+1] = y[i] + h * dydt(x[i], y[i], z[i]);
z[i+1] = z[i] + h * dzdt(x[i], y[i], z[i]);
}
//x、y、zは解を入れる配列(0番目は初期値)、hは刻み幅、dxdt、dydt、dzdtは上述の式
すみません、自己解決しました
刻み幅が十分で無かったため、発散してました
793 :
デフォルトの名無しさん:2005/08/25(木) 14:53:38
猫でも分かるプログラミングってほとんど初心者の自分でも分かりますか?
いくつか種類があるみたいなので初心者でも分かる本のタイトルを教えてください。
前見たような記憶では付属のCDがあったんですがそれにはコンパイラが入ってるんでしょうか?
>>793 本は見たことないけど、サイトのほうを見るとあまりよくないと思う。
(本はゴーストライターが書いていて、悪くはないって話もあるけど)
>>793 過去ログサイトから 2ch books を見ていろんな本の書評を見てみたら?
>>793 猫だとは基本的な概念とか文法についての説明が不足しているので
他にちゃんとしたC言語の入門書 (サイトでもいいけど) がほしいところ。
あと、付属のCDにはコンパイラとサンプルソースが入ってた気がする。
797 :
デフォルトの名無しさん:2005/08/25(木) 15:33:45
お答えどうもありがとうございました。
では、他の本で分かりやすいおすすめのはないでしょうか?
void
>>795 そういうページがあるのを初めて知ったw
過去ログにまとまってるリンクも便利だね。
>>793ではないが、ありがトン
>>793 >>795+推薦図書スレ行ってこい
そこのお勧め本使ってそれなりに勉強してる最中の俺ガイル
個人的には日下部先生の本がお薦め
803 :
793:2005/08/25(木) 21:19:12
すいません、なぜか795飛ばしてましたorz
柴田望洋氏の本を図書館で借りてみました
過去ログも見てみます
漢字とか2バイト文字ってどう実現させればいいんでしょうか
メモリに2バイト格納すればいいと思うよ。
DOSだとアルファベットをscanfとかで配列や動的に確保した変数に代入できますが、
漢字とかひらがなとか入力できないんでどうすればできるのかなぁと
できますがなにか。
コマンドプロンプトの設定を替えればできるのかな。
全角/半角じゃ入力が切り替わらないって問題?
Alt+全角
どいつもこいつも小出しにしやがって
そうです。すみません説明不足で
813 :
デフォルトの名無しさん:2005/08/26(金) 00:33:18
重複してたらすいません、コンパイルするさいに
エラーE2209 インクルードファイルをオープンできない、といわれました
borland c++ 5.5 ってコンパイラーを使ってます。
誰か教えていただけませんか?
セットアップを死ぬほどやれ
815 :
813:2005/08/26(金) 00:43:13
w やっぱそうですよね、
cの本についてるCDと同じ名前だったのでc++の本についていた付録CDをつかったんですけど、
それは関係ありませんよね?
コンパイルするとき bcc32 ***.c ってやってるんですけど
cのときとc++のときってコンパイルの仕方が違ったりするのですか?
超初心者ですいません、あと環境設定ってのはなんですか?
ググれ。
817 :
813:2005/08/26(金) 00:45:41
らじゃ
readme嫁
819 :
813:2005/08/26(金) 00:50:33
そのreadmeがcにも適応してるのかどうかわかんなくて
cをコンパイルするときでもbcc32でいいんですか?
c++のコンパイラでもcはコンパイルできるって書いてあったのでやってたんですけど
とりあえず全てのマニュアルを嫁
821 :
813:2005/08/26(金) 00:52:36
了解
いっとくけど、マニュアルも読まない
自分では調べない
自分で解決しようとせずになんでも人に聞く
こんなやつには、プログラミングはできない
823 :
813:2005/08/26(金) 00:58:00
そーですね、甘えてました。
自分でなんとかします
つーか、スレ違いだって気づけ。
825 :
デフォルトの名無しさん:2005/08/26(金) 04:11:02
すみません。
どこのスレに書き込んでいいのか分からなかったので
とりあえずここに書かせてください。
試験なんかに使うマークリーダー用のデータ読み取りプログラムというのは
どういった言語で構築するのでしょうか?
ちなみに、仕様はCSVファイルのデータをマークリーダー(読み取り機)で
読み込んで正否などを打ち出すらしいのですが...
>>825 とりあえずはすれたてるまでもない質問スレでやれ
CSVにはどんなデータが入っていてリーダーはどの機種で
OSや予算や使える言語も最低限書くこと
827 :
デフォルトの名無しさん:2005/08/26(金) 04:28:55
即レス感謝します。
でも、どんな言語で作るのかを聞きたいのに
使える言語も最低限書くことと言うのは、どういう意味ですか?
因みに
OS Win
予算 数100万
CSVの中には 試験に必要な「個人情報」と答案用フォームに書き込まれた「解答番号」です。
リーダーの機種名は 不明です。
>>827 頼むからここを荒らすな。
スレ違いつーか、鼬害なんだから。
829 :
デフォルトの名無しさん:2005/08/26(金) 04:41:39
そうですか。
失礼しました。
830 :
デフォルトの名無しさん:2005/08/26(金) 04:48:59
ループの展開をするマクロを書きたいのですが,どのように書けば良いのでしょうか?
例えば,
c = a[i][j + 0] + b[i][j + 0];
c = a[i][j + 1] + b[i][j + 1];
c = a[i][j + 2] + b[i][j + 2];
c = a[i][j + 3] + b[i][j + 3];
見たいに書く代わりに,
LOOP_4(c = ....);
みたいにかける LOOP_4 のような物が欲しいです.
こういうのって割と需要ありそうなんですが,検索してもなかなか見つかりま
せん.識者の方,アドバイスお願いします.
インライン?行数稼ぎ?
boost preprocessor を使うのはどうだろ。
#include<boost/preprocessor.hpp>
#define GEN(z,k,_) c = a[i][j + k] + b[i][j + k];
BOOST_PP_REPEAT(4,GEN,_)
こんな感じ
>>830 普通にfor文のループで書くしかない
わけのわからんマクロ作ったらタコ殴りの刑
訳あって明示的にインライン化したいんです.
>>833 ありがとうございます.できれば C でやりたいんですが,やっぱり無理なんでしょうか.
無理
ループのアンロールでしょ?
高速化の随分と最後の方にやるモノではあるのだが、
使わないこともない技術だ。
838 :
833:2005/08/26(金) 05:57:52
preprocessorしか使ってないはずだからCでも使えると思いますよ
一応手元のgcc,vc,dmcでは問題無かったです。
839 :
デフォルトの名無しさん:2005/08/26(金) 06:03:13
>>838 おお.
Boost == C++ ってイメージがあったので試さずに書いてしまいました.
ありがとうございました.
つーか、ループアンロールならコンパイラにやらせればいいじゃん。
/*10個の英字を読み取り、その中からアルファベット順に並べたとき
一番最初にくる文字を表示するプログラム*/
#include <stdio.h>
int main(void)
{
int i;
char ch1, ch2;
printf("英字を10個入力してください\n");
ch1 = getchar();
for(i = 0; i < 10; i++){
printf("%d", i); /*動作確認のため*/
ch2 = getchar();
if(ch1 > ch2){ch1 = ch2;}
}
printf("%c", ch1);
return 0;
}
ループの中で1つ文字を読み込むときにi++が2回行われているようなんですが
どうしてでしょうか?
>>841 改行コードでも入力されたんだろ。
詳しく知りたいなら初心者スレにでも行ってくれ。
>>841 英字10って言ってるけど、それだと11個入力しないといけないんじゃない。