1 :
デフォルトの名無しさん :
2008/04/29(火) 09:44:57
2 :
デフォルトの名無しさん :2008/04/29(火) 09:45:21
3 :
デフォルトの名無しさん :2008/04/29(火) 09:45:57
過去スレのリンクってなんか意味があるの?
●にはね
リンクの h 削るのって意味あるの?
書き込めない
8 :
デフォルトの名無しさん :2008/04/29(火) 12:01:10
#include <iostream.h> main() { char *(*pp)[3]; printf("%lu", sizeof(char*)); printf(" pp%lu", pp); printf(", ++pp%lu", ++pp); } というプログラムを実行すると "4 ,アドレス ,アドレス+12"と、表示されました。 ppは要素が三つの配列へのポインタのポインタだから、 ppがインクリメントされればアドレス+4になると思うのです。 どうして成らないのでしょうか?
4x3
> #include <iostream.h> スレ違い。
11 :
デフォルトの名無しさん :2008/04/29(火) 12:14:29
これが++(*pp)なら4*3で理解できるのですが...
12 :
デフォルトの名無しさん :2008/04/29(火) 12:16:08
えっと、質問なんですが。 C言語で 1分待機してから次の分を実行 みたいな関数というのは存在するのでしょうかー? また存在しない場合そのような動作をさせるには どうすればいいんでしょうか・・・?;
13 :
デフォルトの名無しさん :2008/04/29(火) 12:18:35
clock関数では?
#include "windows.h" Sleep(60000);
15 :
デフォルトの名無しさん :2008/04/29(火) 12:49:43
16 :
デフォルトの名無しさん :2008/04/29(火) 14:27:37
Javaプログラマです。Cの学習の王道ルート を教えて下さい。Javaは自由に書けるので、 構文の基本は大丈夫かと思います。 勉強する際に便利な環境などもあわせて教えて いただけると嬉しいです。
Javaが自由に書けたらそんなアホな質問はしない。 まずはJavaを勉強するように
エクリプス+CDTでいいんじゃね 使った事ないけど
JAVAからCとか大変だな・・・
malloc/free だけちゃんと理解してくれれば それ以上困ることはほとんど無いと思うよ。
22 :
16 :2008/04/29(火) 21:09:42
すみません、外からでしたので変な書き方でしたね。
自分のスペックですが、Javaでの開発経験がそこそこあり、
Javaに関しては仕様が与えられれば実装方式など自分で
考えて行えるレベルです。
最近、もう少し低レベルというか、アセンブリに近い部分に
ついて勉強したいと思い、それなら高級アセンブリと言われる
C言語だと思って質問をいたしました。
Cについては、ずっと昔に「独習C」とか、その他小さな本を読んだ
経験があるぐらいです。実務などでの経験はゼロ。「独習C」も
最近見たら全く読んだ覚えが無いぐらい忘れてましたw
基本的に今後実務で使用する予定も無いのですが、制御系や
OSカーネルの世界をちょっと知りたいのと、言語としてどういう
ものなのか、きちっとした仕様のようなものを知りたいと思ってます。
なので、よくある入門書というよりは、C言語っていうのはこういう
言語なんですよ、こういう原理原則なんですよ、という本などを
教えていただけると嬉しいです。
>>21 おお!これ、面白いですね。早速読んでみます。ありがとうございます。
>>22 こうしてjava使いは馬鹿にされるのか・・・
>>22 ほんとにそんなスキルあるってんなら
規格書でも読んでればいいんじゃねーの
25 :
16 :2008/04/29(火) 22:51:35
>>21 のサイト中にも紹介されてました、カーニハン&リッチー『プログラミング言語C 第2版』を
購入して勉強してみようと思います。
スレ住人の方々から見て、この本はいかがでしょうか?
いいんじゃないすか Javaの経験があるなら入門書読んでも意味ないだろうし
>>8 ppは初期化されていない。つまりどこを指しているかわからない。
どこを指しているかわからないポインタへの演算は未定義となる。
上のことをさておいても、ppがなんであるかを本当に理解しているか。
ppはcharへのポインタの要素数3の配列へのポインタであり、
これをインクリメントした値は元の値よりcharへのポインタの要素数3の配列ぶん後をさす。
charへのポインタの要素数3の配列の大きさはもちろんcharへのポインタ三つぶんであるから、
charへのポインタの大きさが4であれば当然結果は12となる。
>>25 エキスパートCプログラミングもよかったよ。
ネットの「C FAQ」も一通り目を通すといい。(一部内容が古いけど)
独習C持ってるんなら一通り目を通して、それでも本が必要だと思ってから買ったら?
>>22 時間に余裕があるなら、まずアセンブラでプログラム書くことを勧める。
極々簡単なヤツでいい。
JavaのアナロジーでCを理解すると失敗しやすい。
Javaから見たC言語って、階層でいうとJavaより物理層に1段近くて アセンブラの1段上みたいなポジションだよな。
32 :
デフォルトの名無しさん :2008/04/30(水) 10:27:22
すさまじく低レベルな質問ですまないのだが、 GlobalLockのメモリを動かないように固定するの『動かない』と 『固定する』ってどういう意味?
>>32 Cに関係ないのでスレ違い。
まぁ、それぞれ「メモリアドレス」が主語になっていると思えばいいよ。
34 :
デフォルトの名無しさん :2008/04/30(水) 11:01:48
質問なんだが、なにかオススメの入門書ないだろうか? 『これならわかる C 入門の入門』を買ったんだが、ボーランドの無償Cコンパイラがなくなってて、別のフリーコンパイラを代用しようとしたんだが、本の通りに進めれなくてオワタ
35 :
962 :2008/04/30(水) 11:02:11
前スレ962です。回答ありがとうございます。遅れましてすみません。 fflushなんて初めて聞きました調べてみたらfsyncってのもあるんですね。 それらを使用しても確実ではないようですがだいぶ安定するかと思います。 たすかりましたm(_ _)m
>>32 APIのスレで聞くべし。
メモリーって実は地動説だったりするんだよ。
37 :
32 :2008/04/30(水) 11:25:13
そういえばそうだな。ありがとよ。
39 :
デフォルトの名無しさん :2008/04/30(水) 15:38:30
英語では文末記号にピリオド(.)が使われているが、なぜC言語にピリオド(.)ではなく、セミコロン(;)を使うのか教えてもらえませんか。
仕様
ピリオドだとカンマと見分け付かないから、俺は嫌だな。
英語では、ピリオドより弱い区切り記号としてセミコロンが使われます。 また、ピリオドは文中でも小数点記号として使われることがあります。 この辺りを鑑みてセミコロンを文末記号として使うことにしたのでしょう。 もしかしたら、そういうスタイルの言語が既にあったのかも知れません。
ピリオドに対してはコンマじゃね?
あと、コロン、セミコロンに関しては、英語でなくても ある名目に対しての説明、要するに = のような役割をしているよ。
>>44 文の区切り記号としては、ピリオド>セミコロン>カンマの順で弱くなる。
>>47 えーと、どなたかコロンの強弱に言及なさってましたか?
49 :
デフォルトの名無しさん :2008/04/30(水) 16:36:04
今基礎的なこと勉強してるのですが 中々とっつき難いです、最初はこんなものなんでしょうか? ちなみに本を読んで独学で勉強してます
>>43 その理由ってお前の思い込みだろ?理由なんてどうでも良いんだよ
ソースコードを記述するのに使われている区切り、ただそれだけ。
っつか、ソースで . や , を区切りとして使っている例を持ち出してみよう。
引数の区切りに , (コンマ)が使われておりますがっ、良いですか?
. (ドット)を使った、オブジェクト指向のコードにメソッドやクラス、構造体の要素を
結合する場合にも使われています。そうなると、ピリオドが終わりを意味するのではなく
結合に使われているという、文章の区切りでの説明が矛盾します。
ゆえに、これ以上個人的な思い込みではなく、規格書があるならそれを用いるなり
法律で言う基本原則の憲法を用いるような形で説明を求めます。
なんで、基本ルールを無視して、あいつ気にくわねぇ、基本的人権を無視して
俺ルールで批判してやれとかって話になるのでしょうか?理解不能
理由なんてない。規格でそうなってるんだよ。 もし規格で\を区切り文字にする言語を作ればそういう規格になるだけ。 理由なんてない。考えるな。感じろ。
>>51 >46は>44に対してなので、英文での話です。
それはさておき、「半分(半ば)」の「コロン」ってのは微妙ですね。
まぁ、M-Wにはこう書いてあるわけですが。
--
semicolon
a punctuation mark ; used chiefly in a coordinating function between major sentence elements (as independent clauses of a compound sentence)
colon
a punctuation mark : used chiefly to direct attention to matter (as a list, explanation, quotation, or amplification) that follows
comma
a punctuation mark , used especially as a mark of separation within the sentence
period
a point . used to mark the end (as of a declarative sentence or an abbreviation)
--
一応拙いながら訳しておきますとこうなります。
==
セミコロン: 句読点「;」は主として主要な文章要素の調整機能に使用される。
コロン: 句読点「:」は主として後続の重要項目に対する注意として使用される。
カンマ: 句読点「,」は特に文中で分離記号として使用される。
ピリオド: 点「.」は終わりを示すために使用される。
==
コロンはどちらかと言うとマーカーということですから、セミコロンとは役割が違うということですね。
>>50 >43は英文でのセミコロンの使われ方から推測しているわけです。
また、ピリオドに関しても「文の終端」という機能以外にも「小数点記号」などとして使われるからこそ、
Cでは終端記号として採用されなかったのだろうという推測です。
まぁ、「理由なんてどうでもいい」という話だけなら納得できますが。
後半は私には関係ないと思いますが、どなたか「批判してやれ」って話をなさってます?
私がアホ呼ばわりされているだけの気がするのですが。
>>54 お前さぁ、周りから変な目で見られてない?英数文字がコードでは
原則的に使われているが、あれは機械が演算するのを
人間がわかるコードで記述したものであって、英文法じゃないからw
どこで1文が区切られているか?の規定ごとに、英語の強弱が
関与してますよと説明して、それが根本から覆された説明文を見て
まだつまらない食い下がりをするの?すまんが、あんた何者だ?
標準化を決めている組織の関係者か?ただの一講師か?
初心者の生徒か?ナンバーサイン野郎にしろ、気持ち悪い思い込みが激しい香具師が目立つな
それじゃさぁ、HTMLにおいて、タグを <>で囲っているが、これは? 数学ではその記号はジャポネーゼでは大なり、小なり、英語では greater than , less than という意味だが?言語や使われ方によって 本来の意味なんてナンセンスだろ?もともと演算子の優劣でさえ 人間が勝手に決めたものだよ。
ピリオドは小数点とかぶるからじゃね?
私の為にけんかはやめて!
= は式を計算して導くというよりも、プログラム言語では 左にある変数に対して 代入 となる。 しかし、人間が数学で使っている 3+4=7 は 3+4 は 7 という結果 あるいは7と等価という意味であり、全く意味が異なってくる。 比較演算子に == と決めたが、これは 成り立つかどうか? という評価であって 結局人間がコンピュータに解釈させるために決めたことであって コンピュータが人間の言語として理解しているわけではない。 そこで、英文法での優劣を持ち出されて説明されても、へっ?意味が分からないんすけど? ってなるわな。
英語とC言語は別物、ってことでいいでしょ 次の質問をどうぞ↓
またいつものキチガイかw
流れが読めません>< しかも中身のなさそうな長文ばかりで読む気がしません!
>>61 自己紹介乙。お前かなり頭がイカれてんな。こんなところに常駐して
自分が気に食わない奴をネチネチ煽るその性格。人間性のレベルが低すぎ。
あと、プログラミングに関してもお前は頭が悪いから向いてないよ。
IDも出ない板で雑談と煽りあいですか
>>62 長文になると中身が分からなくなるなんて、
受験じゃ国語と英語は失敗するぞ、お前。
数学も題意が分からずに間違った解答をするでしょうな。
>>55 お説ごもっともですが、すべてのファイルに EOF があると思っているとか、
#define で複数行にわたるときの書き方をしらないあなたに何を言われてもねぇ。
ナンバーサイン野郎はキレるとファビョると、メモメモ
質問系のスレって何でこんなに荒れるの?
ナンバーサインがキレたw
途中、英語では・・とか意味不明なのがありましたがC言語の世界に戻ってよろしいですか?過去眺めてると pointer が肝なのかな。たとえば・・ int *a; a[0] = 10; a[1] = 20; ... のような事を始めてみたりしてます。これはあまり必要性が見えません。必要ないのに pointer を使うとろくなことは無いわけです。 以下が良い例と言うわけではないが気分は伝わるといい。 const int mdayA[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; const int mdayB[] = {0,31,29,31,30,31,30,31,31,30,31,30,31}; int* mday; if(うるう年なら) mday = mdayB;; else mday = mdayA; 以下 mday[] でうるう年の時もそうでないときも同じソースで記述てきる。 これを const int mday[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; mp = 0; if(うるう年なら) mp = 1; mday[mp][] となるよね。 pointer を使うと何かすっきりしそう。気分の問題です。
じゅーろくしゅるいでじゅーろくちゃ
>int *a; >a[0] = 10; a[1] = 20; なんにもわかってないw
>のような事を始めてみたりしてます。 誰がだYOw
>>73 前者は致命的に間違ってる
後者はむしろ構造体の出番だw
>>75 >>76 >>77 こんなコードを書いて質問する人がC始めた人に多いというがいいたいのだヨん。
この前のスレみてて何度か目にしたよ。
とにかくチミ達は始めに3行みて反応してるね?(2chはそんなもんか・・w)
最近C言語を勉強し始めたものです 今日、「Hello World」まで出来ましたが。。 参考書を読みつつ覚えるのも飽きてきましたorz そこで、簡単な問題を出して頂けませんか? よろしくお願いします
HelloWorldで飽きた人間に出せる簡単な問題って難しくないか? fizzbuzzとか?
>>79 テキストファイルを開き、その文字列の中から
abcと言う文字が何個含まれているか、カウントして
なおかつ該当箇所が何行目にあったかを表示せよ。
おまえら優しいな・・・・・・・
>>79 では史上最初に出現したアルゴリズムを追体験してみましょうか。
「a = 1190, b = 1394 とおき、a, b の最大公約数を求めよ。」
最大って存在すんの?
85 :
79 :2008/04/30(水) 23:59:06
>>79 朝だったら、おはよう。昼だったらこんにちは、夜だったら今晩は、夜中だったっら、おやすみなさい明日はオハヨウって表示するように改造するんだ。
っつか、素数を1〜2^32 -1 の範囲内で求めよ。 むっちゃ時間かかるで?w
配列サイズの決め撃ち禁止するなら とりあえず deque の実装からはじめないとな
別に両端に追加できなくても最後に追加さえできればいいじゃん
dequeである必要は無いだろ まずは単方向リストだろ
配列リストだな。 つーか効率的に実装したスタック?
俺はチムポラリーファイルを使わせてもらうぜ
その前に書き込み保護されて書き込めません
>>65 そう、でも宿題スレではその実力のほどが露呈されてしまったので、さすがに出てこなくなったようです。
出したり引っ込めたり、くだらないソースなのに一人芝居をうじうじしていているのをみて、期限きって答えを書いてやりました。
無論、宿題スレでバンバン答えを出していただけるのであれば、歓迎します。
96 :
デフォルトの名無しさん :2008/05/01(木) 00:58:24
>>95 お前がまともに答える能力がなく、コピペに反応して必死になっていた
基地外ですって自己紹介乙w
>>95 > 期限きって答えを書いてやりました。
もろにあのときに、ソースを書くわけでもなく噛み付いていただけの
無能ですって露呈しているのがお前なのがワロスw
98 :
79 :2008/05/01(木) 01:00:33
>>83 さんできました。1時間以上かかりましたorz
#include <stdio.h>
main()
{
int a=1190,b=1394,c=-1;
while(c !=0){
c=b%a;
b=a;
a=c;
}
printf("最大公約数=%d",b);
}
>>81 さん、
>>87 さんのはハードル高そうなので
次は
>>86 さんのをやって見ます
板汚しスイマセン
>>95 お前が糞だから無能を露呈しないためにも、簡単な答えの分かりきった
宿題しか答えられい、実力なきクズだとばれているから。
その言動にお前のレベルの低さが露呈されてますよw
>>95 ん?もう終わりか?威勢が良くないな、ヘタレ小心者。
お前みたいな奴は、一生まともにはなれんよ。思い上がりの前に
気に入らなきゃ誰それ構わず、自分が間違っていようが多勢に無勢で
攻撃をするから失敗するんだよ。まぁ、もちっと人間社会の人間慣れをするんだな。
所詮誰でも自分なんて数多くいる人間の中の一人。
どんな偉人でも完璧な人はいない。ましてや、こんなスレで初心者相手に
自分は相手が知らないことを知っているということで、安心しているようじゃ
先が知れてる。自分が知らない、体験したことがないことなんていくらでもあるが
こんなの基本は分かりきっていることだろ。その基本事項を用いた説明に対して
自分の体験談や思い込みで反論するから、簡単に跳ね返されるんだよ。
お前じゃ、炭素とダイヤが同じ成分で構成されていることすら知らんだろうよ。そんなもん。
>>98 結構前にこのスレだかで見た気がするが「projectEuler」とやらをやればいいじゃない
C言語というよりアルゴリズム、数学の問題だが
>気に入らなきゃ誰それ構わず、自分が間違っていようが多勢に無勢で >攻撃をするから失敗するんだよ。まぁ、もちっと人間社会の人間慣れをするんだな。 自分のことだろw
相手してるやつのほうがうぜえよ 放置しろ
>>103 基地外馬鹿が、その程度の反論しかできないのか、お前性格が腐ってんぞ。
自分のしたレスを読み返せ、こぴぺに反応した馬鹿w
>>95 > 期限きって答えを書いてやりました。
期限が延長していたわけだが、どこに噛み付いてだこの基地外?
宿題スレで延々と続けたスレ違いを、このスレでもやろうというのか 別の場所でやれ
型の違うものの配列ってどうやって実装するの?
void* array[]
>>111 普通は共用体の配列(場合によっては、データを保存するための共用体と型を記憶するためのフラグ変数をセットにした構造体の配列)を使う
型のサイズが極端に不ぞろいでメモリを節約したい場合にはvoid *の配列を作って各配列要素に適切な領域を割り当てる
強制IDのところへ移動してやったらどうかね?
117 :
デフォルトの名無しさん :2008/05/01(木) 15:44:09
質問です。 初歩的なことですいません。 親関数から子関数にとんだときに子関数がreturnしたら親関数も一緒にreturnすることってできますか? 例えば、、、 void func(void) { sub(); いろいろな処理; return; } void sub(void) { return; } となったときに 『いろいろな処理』を行わないでfunc関数を終了したいのです。 適当に作った関数なのでそこの突っ込みはなしてお願いします。 subに値を返させてfunc関数内でsubを呼び出した後にif文で処理するのが オーソドックスなのかと思いますが、 func内でif文を追加できない状況です。 exitも全て終了してしますのでダメです。 よろしくお願いします。
longjmp するくらいしかないんじゃないか?
func内にifが追加できない状況ってのがよくわからん。 っていうか、その例だといろいろな処理は常に実行されないってこと?
void func(void) { sub(); いろいろな処理; return; } ↓ void func(void) { sub(); /*いろいろな処理;*/ return; }
多分 func がライブラリで提供される関数で、 sub をコールバック関数として渡すんじゃないかと思われ。
だと仮定するとsubでスタックをいじるとかあやしい事するしかなくね あるいはコードを直接書き換えるか
jmp_buf env; を作って、func を使う部分を if (! setjmp(env)) func(); とし、sub 内で return する代わりに longjmp(env, 1); とする。 これで一応目的の動作にはなる。 それでいいのかどうかは知らんが。
func()呼ばずにsub()呼べばいいだけじゃ
>124に1票 あるいは、sub()の後の"いろいろな処理"を別メソッドにして、func()呼び出している側がそれを呼び分ける
>>112 ,113
おk
試してみる
void*の配列のほうが汎用性が高そうだけど型キャストがめんどくさそうだ
127 :
デフォルトの名無しさん :2008/05/01(木) 19:30:02
>>121 - 125
回答ありがとうございます。
正直言いますと自分の設計ミスなんですが、上の例で言いますと、
func関数内でsubに引数与えて(例では引数ありませんが)何回も呼び出してるんですよ。
で、subはエラーを返すんですが、funcに返ってきた時点でエラーならさらに上の関数に戻りたい。
しかし、subを呼び出す度にif文処理をするのが妥当なんですが、時間もかかるので、
もし何か良いやり方があったら教わろうとしたわけです。
jmp関数はgoto文と似ていますね。
goto文は使わない方が良いと言われていますがやはりjmpもできる限り使わない方が良いんですか?
>時間もかかるので そんなことを気にしなきゃならないような状況なら 悪いことはいわないから設計からやりなおせ
せいぜい、整数の判定をかけるだけのif文はさむよりも longjmpにかかるコストのほうがでかいなんてことにならないようにな
if文処理するのが妥当なの分かってるんならif文で処理しろw
直せるけど面倒臭いだけかよ! C限定じゃなければsub()で例外スローして終了なんだけど 涙目でsubの呼び出し箇所をひとつづつ修正していくんだ
素直にfunc()の設計しなおしをお勧めするね。
>>133 誰がいつすべてのファイルにEOFがあると言ったん?
お前の勘違いの方がアホだろ・・・あのね、思い込みで
話をこじらせるな。EOFの入力について。
もうね、お前みたいな 入力 の基本も知らない奴にバカ呼ばわりされたくねーから
最終的には、やはり学んだ場所、学歴が重要だってわかったわ。
いくら優秀なドライバーでも事故が起きれば終わりだしな。そんなもんだぞ、人生は。
で、あのプログラムにおいて、EOFを入力させると無限ループするってトラブルが 対処されていなかったという、穴があったという話で、良くここまでしつこく粘着が出来るな。 マジきめぇよ、お前。性格狂ってんな。絶対に社会に出てくるなよ。お前みたいな奴は 何をしでかすか分からないからw
お 話 も 終 い
>>67 > #define で複数行にわたるときの書き方をしらないあなたに何を言われてもねぇ。
言った覚えねーわ・・・なんだこいつ?妄想癖があるのか?マジきめぇ、あぁきめぇ
どんな面してんだろ?鏡見てこいよ、それ、お前の面だから m9(^д^)
>>95 > その実力のほどが露呈されてしまったので、さすがに出てこなくなったようです。
お前の実力がしょぼいから、そうやって個人叩きしか出来ないか
資料を調べて必死に抵抗することしか出来ないんだろ?w
なんだよ、EOFがあるないを無理やり論点に持ち込む奴って?w
まるで、自分が違反をしても、他にも違反している奴がいるとか
あっ、俺に対して違反だといったお前、今違反しましたね?みたいな
ガキが小学生レベルの知能だな、こいつw
(∩. ゚д゚)アーアー聞こえない
質問です。 文字列の配列を直接引数として関数にわたしたいんですが、 引数の型定義はどのようにすればいいのでしょうか? 具体的には、 void function(??? data){ ... } int main(void){ char mojimoji[10][80]; function(mojimoji); } といった感じで、???のところがわかりません。 "char *"、"char **"では駄目でした。 よろしくお願いします。
そういや、昔ASCII以外にもEBCDICがあったとか、んじゃお前は今更 それを使うのかと?なぁ、時代遅れのオッサンがここでのさばってんの? インターネットを最近知ったとかで?今更古い手法に合わせてプログラミングをするの? ねぇ?教えて、EOFがなかった時代を知っているプロさん? っつか、ろくにコードを書かない奴ほど、ぎゃーぎゃーわめくよな、自治厨みたく。 実力云々以前に、他人の粗探しをして楽しいのか、こいつ?
char data[10][80]
void function(char * data){ } int main(void){ char mojimoji[10][80]; function((char *)mojimoji); } か mainは変えずに void function(char (*data)[80]) void function(char data[][80])
原則的にはchar data[][80]
まぁ、ファイルにEOFがあろうがなかろうが、キーボードからの入力だから。 ナンバーサインはEOFの入力が出来ないとかほざいてただろ。 印字可能な文字ではないにしろ、代用の入力文字はあるというのに。 お互い様とは言わないが、粗探しする前に本題に目を向けてくれ。 入力とは、信号やデータなどを機器へ取り込むこと全般。その形式、手法は様々。
146 :
140 :2008/05/01(木) 23:00:51
C言語でURLの一部でブラウザを振り分けるプログラムを作りたいんですが、
プログラム内から、他の実行ファイルに引数を渡して実行するにはどうすればいいんでしょうか
コマンドプロンプトだと
C:\Program Files\Internet Explorer>iexplore
http://***/ と同等の事をCでやりたいのですが
>>145 んん? EOF はファイルにあるのではなくファイルの終わりをみて返されるものだよね?
EOF (-1) は char でなく int で受けないと処理系で(俺は行ってる、俺は行かない)みたいな不毛な会話が飛び交ったりするし。
ま、なにか EOF の扱いで随分と迷走してる気はするな。そう、粘着するレベルのものではないよ。前にすすもうよ。
>>147 C言語の話としてやるならsystem()使えで終
実際にはWinAPIのShellExecute()を使うことになるだろう
詳しくはAPIスレで聞け
>>149 ありがとう
APIの事はほとんど分からんのでとりあえずsystemとやらを使って作ってみます
system はセキュリティ上の問題があるからな。 一応そこんとこは分かった上でよろ。
>>148 だからそのコードをキーボードから入力することについての話だったんだが・・・
何ごちゃごちゃその定義にまで話を持ち込もうとしてんだ???
お前ってさぁ、自分のステータスは良くなくても、所有している
スポーツカーがかっこいいだろ?乗るかい?って乗った女性を
家までさらっていくタイプだろ?目的がちがーうって振られるタイプでしょ?
スレ違い
入力の終わりを通知することを「EOFを入力する」と定めるなら、余裕で可能です。
この前だってそういう話で終わったじゃないか。
荒らしに付き合うやつも荒らし キチガイに付き合うやつもキチガイ
getchar()が云々はどうでも良い。キーボードから入力が可能です 当然EOFコードを検出するのに、ファイルの終わりを示している コードを使うのもありです、本当に本当に、重ね重ね、ありがとうございますた!
□!!!これを見た貴方は3日以内に死にます!!!■ ■死にたくなければ、このレスをコピーして他のスレに □ □10回貼り付けて下さい。1時間以内にです!もし無 ■ ■した場合は、今日寝ている間に富子さんがやってきて□ □貴方の首を絞めに来ます。富子さんは太平洋戦争の■ ■時に16歳という若さで亡くなった女の子で、未だに成 □ □仏していないそうです。信じる信じないは貴方次第。 ■ ■今年になってからこのレスを無視した人で、“呪われ □ □て死亡した人”が続出しています。これは富子さんの ■ ■呪い。呪われて死んでもいいのならこれを無視するこ□ □とでしょうね。 ■ ■――貴方がこうしているうちに富子さんが後ろから見□ □ていますよ…。 ■ ■□■□■□■□■□■□■□■□■□■□■□■□
おまえらがくだらん煽りあいをしてると初心者の人が質問しにくいだろ
どうせここは隔離スレ(その2)だからどうでもいいよ。
一つ目のウィンドウにHello、二つ目のウィンドウにWorld を表示させるにはどうすればいいんでしょう?
レベル7のエスパーを求む!
>>152 何か切れてる? Unixなら伝統的に ^D = EOF
そそ、だからといって通常に ^D (0x04) が現れても EOF にはならないよ。
とにかくファイルに EOF というコードが有ると勘違いしるのかとおもった。
>>160 おっと、すまん。そのとおりだ。
>>164 どのOSならとかどーでも良いんじゃい(竹原風に)
キーボードからの入力は可能だし、EOFはマクロで値が定義されているし
なんならそれに応じた入力をしてやりゃ良いんだよ。所詮俺らが視覚的に
見えているものは、デジタルデータ、0と1の組み合わせの符号、信号。
配列の宣言時に[]の中に変数って使えないんだっけ? char num[sum]; みたいな
つまりC99では使えると
>>170 そのページのsizeofのところでふいたw
図からわかるようにって、代入しただけで何がわかるんだよ
>>171 図の中のコメントに代入されるはずの値が書いてあるから
それを見ろということだろ。
>>166 結論からいうと変数は使えない・・・ので malloc alloc がある。
char* num = (char*)malloc(num*sizeof(char));
...
*(num+5) = 5; // or num[5] = 0; // みたいな...
...
free(num);
C99では使えるっつーの。
>>165 どうも何かごかいしているね。
EOF = (-1) が定義されているとしてこの -1 は入力できない値(int)なのよ。getchar() などが EOF と判断した条件の時に文字として存在しない値 (int)-1 0xffff あるいは 0xffffffff が返されるものなのだから。。。判るかな?
>>175 君ね、いい加減鬱陶しい。マクロを知らないのか?所詮、プログラム言語も仕様も
人間が都合よく定義、規格化しているだけ。EOFがどうとかどうでも良いんじゃい。
所詮 数値データ だと何度も言っているだろ。あとはマクロを使うことで
より幅広い環境で通用するという話。いい加減、大学にも通ってないような
低レベルとは話はしたくないんで。
>>175 > この -1 は入力できない値(int)なのよ
これだけ取り出しても、こいつが相当な勘違い野郎だということがはっきりしたな。
入力の意味も広義で説明されていたというのに。ねぇ、こういう知ったかが
どこか政府が運営する機関の関係者にいたらどう思う?マジでやべーよ。
まぁ、こんな似非理系は当然、専門学校程度だろうけど。
>>172 コメントの数字が正しいことはどうやって証明するんだよw
プログラムが扱う変数として、EOFの数値データをchar型などで扱うかまで 入力受付のライブラリを用いて話をするが、while(getchar()!=EOF); で ループを止める際に、どうやって止めたいんだい、プログラムは?w 論点はそこじゃない。EOFが入力可能か?答えはYES。適切に処理しない 環境をいちいち持ち出されても迷惑。256色しか表現できない環境で 24ビット画像を正確に表示しようとしても無理なようにね。 くどいが、こんな目の前にある機械なんて、所詮人間がルール(規格)を決めて 定義されたとおりにコンピュータがデータを実装された能力に応じて 展開しているに過ぎない、人間が都合よく解釈できるように。 コンピュータには目の前の文字も画像も映像データも、0と1の塊にしか見えんよ。 あとは規則に則って処理しているだけ。
183 :
166 :2008/05/02(金) 23:57:21
>>173 ありがとう
何故か、当然変数で宣言できると思っててエラーでまくってた
>>175 > この -1 は入力できない値(int)なのよ
別にint型とは限らなくね?符号ありのchar型にも収まる数値だが?
#include <stdio.h>
int main(void) {
char a=EOF;
unsigned char b=EOF;
if(a==EOF) printf("a=EOF\n");
if(b==EOF) printf("b=EOF\n");
printf("a : %d / b : %d \n",a,b);
return 0;
}
さすがにそれはないわw
>>185 fgetc(), getc(), getchar() の返り値は int ですから、EOF (-1) はファイル中に存在する値でも
なければ、stdin から入力できる値でもないと思うのですが。
>>185 ああ、ようやく普通の人にであえたきが・・。勘違い
>>182 系に辟易だったので・・・
で、実はそうではない。上位ビットが負号を示すのに用いられてるわけだけど
負号無しの unsigned char の場合 0x00 = 0, 0xff = 255 になって
負号付きの signed char の 0x80 〜 0xff は -127 〜 -1 とするから -1 という意味合いはある。
だけどこの -1 を EOF とみてしまうと・・・それはとても困る。
なぜなら(0x00〜0xff) の範囲にあるものすべて扱えないといけないから。
(0xff)が出現するバイナリーファイルの入出力はできないって事になるでしょ?
キーボードなどから (int(-1)) を入力できないデバイスはどうしたらいいかって事になるけど何度も既出だけど ^D (0x04) を犠牲にしそれを終端と意味付け、これをみて intサイズの -1 を返すという決めをしてる。
例で挙げている char a = EOF; の行でコンパイラから警告がでていない?(オプションによるけども char = int とするときの警告文)
後の比較系は int に負号拡張されるから見かけ動くようにみえてしまうので誤解しやすい。
0x7f (char) が 0x0000007f (int) に・・・同じ値 127 となる。
0x80 (signed char) が 0xffffff80 (int) に・・同じ -127 となる。
0x80 (unsigned char) は 0x000080 (unsigned int) ・・ 128・・という具合に・・
上位ビットを負号ビットに割り当てたのは負号拡張がとても容易だから。
a b が printf に渡った時点で負号拡張された int となっているからね。
#include <stdio.h> int main(void) { char a=EOF; unsigned char b=EOF; int aa=EOF; unsigned int bb=EOF; if(a==EOF) printf("a=EOF\n"); if(b==EOF) printf("b=EOF\n"); printf("a : %d / b : %u \n",a,b); printf("aa : %d / bb : %u \n",aa,bb); return 0; } 後は受け付けた変数の型によって、それ相応に解釈されちゃってるけどね。
>>188 暴れてるのは一人だけで、まともに相手にすると余計暴れるからスルーしてるだけ
191 :
デフォルトの名無しさん :2008/05/03(土) 01:01:03
正直ここで何か聞こうかと思ってスレちょっと読んだが 「C言語きやすく質問おk」と書かれた扉を開けたら 腕組んでイライラした奴らがこっちを見て来た状況と同じくらい 質問しづらいんだが。
192 :
デフォルトの名無しさん :2008/05/03(土) 01:22:02
喋り方がむかつくってだけで正しい意見に対して脊髄反射で反論始めるとこうなるって良い見本だなw
>>183 おっ、丁寧に。サンプル間違ってたけどそこはなんだ。うまく修正してくれたわけか。C99 あるいは今の GNU C/C++系だと気付かなかった世界かもしれん。再変更する realloc もあるで。
放置のできないバカはプログラム以前のことを勉強しなおせ
IDの出ない板はNGにしにくくて困る いっそコテハンつけてその話題をやって欲しいんだが
とりあえずEOFをNGワードにすればおk 来月ぐらいまで我慢すれば飽きるでしょ
ちょ、宿題スレで解答書くときEOF使うから困るw
どうしても駄目なときはうpろだ使え むしろsizeofを間違ってNGしないように気をつけろ
201 :
デフォルトの名無しさん :2008/05/03(土) 08:33:17
--- EOF
ポインタ文字列、char* p = "ABCDE"; って場合は p[0] = 'F'; って変えれないんだよね? char num[80] = "ABCDE"; char* p = num; ってポインタが文字列のはいった「配列」をさしてないと ポインタに添え字つけて一文字代入するのは無理?
うん。規格の範囲内では無理ってことになってる。
204 :
202 :2008/05/03(土) 11:04:39
>>203 ありがとう
サンプルソースがなぜかポインタ文字列を直接操作してて
エラーでまくるから、自分の環境が悪いと思い込んでた
サンプルが間違ってたって事だね
正確には未定義じゃなかったっけ 運が良ければ動くけどやるべきじゃないね
ポインタといえばちょっと前の zdnet builder の記事も酷かったな。 202のサンプルと同じ間違いもしっかり犯してたし。
>>206 過去形にするなや。未だに「レビュー中」のままだぞ。
自分の意に沿わない発言は全て「偉そう」ですか。大儀ですな。
大儀である。下がってよいぞ
大昔、リテラル文字列をいじっていい時代があったんだよ・・・。 リテラル文字列を char* に代入できるのはそれとの互換性のため。 今はもちろんいじっちゃいけないが。 いじっちゃいけないようにすることで、 同じリテラル文字列が登場したらそれを共通化できるようになるし、 もっと言えば "ABC" と "BC" みたいなのも共通化できるようになる。
いやリテラル文字列は const char* constだから 普通にchar*に代入して参照できるわけだが。
>>212 おかしなこと言わない。
リテラル文字列は const char の配列であってポインタじゃないし
(sizeof でサイズを取得できるから)、
char* に代入できるのは 「文字列リテラルは char* に代入できる」 という仕様が
特別に用意されているから。
const char* constってchar*に代入できたっけ?
char* に暗黙にキャストできる、と言った方が良かったか。
>>216 ここのところずっとC++しか触ってないからできないもんだと思ってた
Cだと警告しか出ないのね
なんか大卒の奴にいい負けしてかなり悔しいのぅ悔しいのぅな 時代遅れのオッサンが、GW中にどこにも出かけられないから ここで楽しんでいたところ、気分を悪くしてしまったようでw
>>218 チガウチガウ
リテラル文字列を char* に暗黙にキャストできるという話。
これは C も C++ も同じ。
EOFの次はchar*にリテラル文字列ですか。とことん暇な人が多いですね。
EOF って何の話?
Eroi Oneesan Fujikochan
EOF<ガオー 人
>>220 「リテラル文字列は const char* const」
「const char* constは普通にchar*に代入して参照できる」
だからリテラル文字列は普通にchar*に代入できるって意味の発言だと思ったんだが
私が単に読み間違えただけか。
普通はconst外ししようと思ったらキャストがいるけど、const char* const→char*だけは歴史的な理由によりそれが要らないってことだろ。
>>225 >「const char* constは普通にchar*に代入して参照できる」
こんなこと212しか言ってないような、
そして
>>220 =216=214と
>>212 は別人のような気がする。
ttp://www.sgnet.co.jp/c/2-1.htm ここのサイトで
#include <stdio.h>
void main()
{
printf( "好きなことを書きましょう" );
}
ってなっているので、実際にやってみると
testa.c:1: error: missing terminating " character
testa.c: In function `main':
testa.c:3: warning: return type of 'main' is not `int'
というふうにエラーがでます。
で、大学では
#include <stdio.h>
int main(void)
って習ったのですが、どう違うんですか?こっちではうまくいったのですが。
Cの初心者なんですが、コマンドプロンプトに関して 質問があります。 こちらで聞いてよろしいんでしょうか??
>>229 そのコンパイラが日本語に対応してないんじゃね?
232 :
229 :2008/05/03(土) 18:44:18
>>231 あ、すいません。
#include <stdio.h>
int main(void)
{
printf("好きなことを書きましょう");
}
で、うまく実行できたという意味です。
素早い返答感謝です。 実行すると、内部ファイル云々、操作可能なプログラムと 認識されていません、と出ました。 内定先から頂いたDISCの指示に従ってインストールしたんですが・・・・
何の話か知らないが内定先に聞けよ
236 :
229 :2008/05/03(土) 18:50:11
>>235 難しすぎてわからないのですが…
ようは、void main() と int main(void) は同じような意味だから
できたほうを使えってことですか?
237 :
デフォルトの名無しさん :2008/05/03(土) 18:53:32
C++とCで仕様がちがうのでは?
>>236 戻りはint。引数は依存って書いてあるな。void main(void)は不可か
>>229 そのサイトが嘘つき、もしくは正しい知識をもってない。
大学のほうが正解。
あとint mainでやるなら 正常終了したって事を示す「return 0;」を忘れずに
C99 なら大丈夫だけどね。 まだ C89 の環境多いから return 0; 書いた方がいいけど。
>>232 みたいなちょっと「動作確認しました」くらいのやつならC89でもreturn 省略してもいいよ。
逆に、いちいちつっこむヤツを見ると、省略できるの知らないの? って思う。
質問します。 Linuxのコンソールで擬似和音のビープ音鳴らすのにエスケープシーケンスを 使おうとおもってるんですが、printf関数でエスケープシーケンスを 出力すると、一旦出力バッファに貯められてしまうため、時間差で 音を出したくても上手く音が出力されません。 出力バッファを介さずに文字列を出力する関数ってなにかありますでしょうか?
>>243 return を省略した際の動作は規格上は未定義。
C99 や C++ だと main 関数は特例として省略が可能だが、
C89 では main 関数にもそれが適用される。
大体の処理系は警告出すだけだがね。
246 :
230 :2008/05/03(土) 20:03:24
妙な事をきいてしまってすみません。内定先もGW中で 担当の方がいらっしゃらない物で。 失礼しました。
>>245 動作が未定義ってかリターン値が未定義だろ。
省略しても問題ないよ。
お作法的には書くほうがいいけど、書き捨てのコードにいちいちツッコミ入れるほどじゃないよ。
>>244 Drawin / *bsd 系なので Linux はどうかしらないが fflush 使うか raw モードにするというのももある
// うまく管理して
{
int fd;
struct sgttyb bk, fm;
}
{
if((fd = open("/dev/tty", O_RDWR)) == -1)
return -1;
ioctl(fd, TIOCGETP, &bk);
fm = bk;
if(fm.sg_flags != RAW)
{
fm.sg_flags = RAW;
ioctl(fd, TIOCSETP, &fm);
}
read(fd write(fd でどちらもバッファリング無しで入出力...
>>236 int main() { .... ; return 0; } ですればどうでしょうね。
return 無しの例外が許されてるといいながら return 0; 記述がそれほど手間でもないのでは?
void main() の登場はいわゆる void 型が導入された次期からしばらくの間ではなかったか。サンプルが古いのであって目くじら立てずに見過ごせばどうかな?。
めくじらっつーか、gcc じゃコンパイル通らんし。
>>250 だから int main に読み替えればいいでしょって事なの。参考にしてる物に目くじら立てて(その例文は可笑しい)って作者に文句のメールでも送る?。そんな方向に行くのはどうかという事。
>>251 仮にも 「講座」 を名乗るのにそれじゃマズいだろ。
問題はおかしいかおかしくないか判断できない初心者がそれを読むってことだろ
そうガミガミすんなや、GWも後半に入ったというのに # 自分はどこにも行きませんけど
255 :
229 :2008/05/03(土) 20:59:37
いろいろな回答ありがとうございます 大学で3回くらいしかまだ習ってないので(習ったのはprintf int forとかだけですけど) ばりばり初心者だったのですいません とりあえず普通に勉強していこうと思います ありがとうございました
質問です。 下のコードは書いているものの一部なのですが、 コメントのつけてある位置でエラーが出てしまい、コンパイルが通りませんでした。 typedef struct {int line, *col;} match_info; match_info *info; match_info *str_search(FILE *fp, char *sstr) { int line_cnt; .... // line_cntはここで値が代入されている info = (match_info *)malloc((line_cnt+1) * (sizeof(match_info))); info+line_cnt = NULL; // ここでエラー .... } エラーの内容は error: invalid lvalue in assignment でした。ちなみにinfo = NULLとしたところコンパイルできました。 info + 1 = NULLと定数を使用するとやはりコンパイルできません。 何故オフセットすると値を代入することができなくなってしまうのでしょうか。 お願いします。 (エラーの出ている箇所はこの部分だけであり、載せていない部分ではエラーはありませんでした)
>>256 infoはポインタでしかないから、それに何かを足したものはただの値でしかないから代入はできない。
やりたいことは、info[line_cnt] = NULLではないのか?
*(info + line_cnt)
>>257 ないな。match_infoが構造体だから代入できない。
まぁ恐らく、
info[line_cnt].line = 0;
info[line_cnt].col = NULL;
なのだろう。
260 :
デフォルトの名無しさん :2008/05/03(土) 21:56:30
うるせええええええええええええええええええぞ かすどもおおおお スレ違いなんだよ他でやれ
だからもちつけって (オレモナー)
>>257-259 お早いレスありがとうございます。
やりたいことは確かに
>>259 の通りなのですが、
他の関数でinfoを門番までスキャンさせたくて、門番としてNULLを割り当てようとしました。
ちょうどコマンド引数のargv[argc]に'\0'が入っているような感じに使おうと思っているのです。
>>259 のようにしてしまうと、他の関数ではinfoのメンバーを知らなくてはなりません。
質問では触れなかったのですが、検索用の関数を作っています。
最終的には、main()側でstr_search()や,infoの内容を見る関数をラップした関数を使えるようにするだけで、
他の部分は全てヘッダファイルに移し、隠蔽してしまおうと考えていました。(言葉足らずですみません)
つまりinfoは作業用変数としたいのです。
関数の設計も含めて、何か良い方法がありましたら教えていただけないでしょうか。
最後の要素のcolかlineに特別な値を割り当てておくしかないだろう
>>262 できない。
infoが配列の要素を指している以上、
その値は必ず配列上に存在する要素へのポインタにしかなりえない。
あとはline_cntを公開しておくしかないな こーゆーことやるならC++のほうが圧倒的に楽だけどね…
>262 文字列の最後を\0で検出できるのは、\0が文字型の特殊な値だから。 同じように任意の型の配列の末尾を検出したいなら、特殊な値を割り当てて検出する以外にない。
どうしてもやりたいなら、 match_infoの配列ではなく、 match_infoのポインタの配列を使う。 match_info **info; info=(match_info **)malloc((line_cnt+1) * (sizeof(match_info *))); for(i=0;i<line_cnt;i++) info[i]=(match_info *)malloc(sizeof(match_info)); info[line_cnt]=NULL; こうすれば出来るけど、当然一個一個freeする手間がかかる。
>>262 argv[argc]は'\0'ではなくNULLな。
これはargvがポインタの配列だから実現できる。
infoはmatch_info型の配列だから、
末尾要素をNULLにしようとしても型が違う。
>>256 それはもしかするとこう?
match_info** info; // ← match_info の配列ですね?
{
info = (match_info**)malloc(line_cnt+1)*szeof(match_info));
int i;
for(i = 0; i < line_cnt + 1; i++)
info[i] = NULL+
// ...
構造体の中身を公開したくないのに構造体の内容で判定することはできない。 公開するか、ポインタの配列で実現するかの二択。
>>263-271 みなさんありがとうございます。
argv[]がargv[argc]までスキャンされるのは、
argv[]が文字列の"ポインタ"だからですね。勘違いしていました。
>>267 >>269 でおっしゃられているようにポインタ配列で実装しようと思います。
>>267 >>269 のようにmalloc()がネストされている場合は、
中をfree()してから外側をfree()しなければなりませんか?
手間がかかるようなら、
>>263 ,265も考えてみようと思います。
|
>>267 >>269 のようにmalloc()がネストされている場合は、
|中をfree()してから外側をfree()しなければなりませんか?
もちろん
正規表現のアルゴリズムを勉強したいんスけど、なんかグレートなテキストってないっスかねぇ〜?
>>277 レビューワロタ
参考にしてる人多すぎだろ
「詳説 正規表現」のコラムでも、正規表現をさらに学びたい人は
>>277 の三章を進めると書いてあるな。
せっ・・・性器表現の勉強を(ry お勧めの参考書を(ry
>>274 手元にある本をあげておきます。
オートマトン・言語理論, 富田悦次・横森 貴, 森北出版 1992, ISBN4627805500
これがベストというわけではありませんが、まず理論的な部分をしっかりおさえておかないと、後々どうにもならなくなると思います。
#include のことを、シャープインクルードって言っていた香具師、手を上げろ! ノシ
えっ、違うの!?
本場の職人なら、パウンド・インクルードという。
# #は井桁、ナンバーサインでシャープは♯なんだな。 斜めになっているのが縦棒か横棒か、違うんだなぁ。 シャープは楽譜の記号で使われているんだなぁ。 ぼぼぼ、僕はおにぎりが欲しいんだなぁ。
C#とかあるし、シャープで伝わるからそう読んでるな むしろ井桁とかだと通じないことがあるし
シーナンバー・・・うむ・・・いや、いや、そうじゃなくて、C♯はちゃんと シャープと書かれているんでしょう。同一視してはならぬ、決して。
C#は間違いなく井桁だな まぁシャープの代わりに井桁を使っているから、井桁をシャープと読むのは不適切かも知れないが 井桁が通じないことがあるんだからしょうがない もっと普及させてこい。話はそれからだ
♯の半角が存在しないから、代用しているのさ・・・そう思いたい・・・きっとそうだ。 ♯を英語圏にも広めよう!
値のビット列表示をしたいのですができません 共用体とビットフィールドを使って実現しようと思ったのですができませんでした 下のプログラムだとどこがだめなんでしょうか? #include <stdio.h> int main(void){ union bits{ char ch; unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; } bits; bits.ch = 'a'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); bits.ch = 'b'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); bits.ch = 'c'; printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h); return 0; } /* 実行結果: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 */
fgets(str, 32, fp); こんな感じに書いたときに、 strの宣言がcharの配列だったらいいけど、 charへのポインタだったらだめだった。どうして?
>>293 運が悪くポインタの指す先が書き換えてはいけない場所だったから
>>292 a, b, c, d, e, f, g, h が union で共用されているから
#include <stdio.h>
int main(void){
union bits{
char ch;
struct{
unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
};
} bits;
bits.ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'b';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'c';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
return 0;
}
297 :
293 :2008/05/04(日) 11:04:20
>>294 >>296 そうだよね、何処にあるかわからない入れ物を渡してもダメに決まってるよね。
すっきりしますた。
>>295 unsigned とかやってるとサイズが4バイトになるから
union bits{
char ch;
struct{
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
};
} bits;
にしないとマズいかもしれない。
ただ、ビットフィールドを含む構造体のサイズは処理系依存なので難しい所だが。
さらに言えばビットフィールドのビットがどちら側から埋められるかは処理系依存だから、
union bits{
char ch;
struct{
#ifdef BITFIELD_LITTLE_ENDIAN
unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#else
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#endif
};
} bits;
として処理系ごとに切り替えられるようにするのが良い。
unsigned char に対応していない処理系を考慮するなら union bits{ char ch; struct{ #ifdef BITFIELD_LITTLE_ENDIAN #ifdef BITFIELD_INT_SIZE unsigned : sizeof (unsigned int) * CHAR_BIT - 8; unsigned h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1; #else unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1; #endif #else #ifdef BITFIELD_INT_SIZE unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; #else unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1; #endif #endif }; } bits; とすることになるが、この共用体のサイズが1であることは期待できない。
>>295 ,298,299
ビットフィールドが全部同じ位置を使っていたということですね
プリプロセッサディレクティブは未学習なのですが、イメージはつかめました
ありがとうございました
1ビットしかなくて読むだけなのにビットフィールドの共用体なんてフツー使わねえよ。 #define BIT(val, pos) (((val) >> (pos)) & 1) int ch; ch = 'a'; printf("%d %d %d %d %d %d %d %d\n", \ BIT(ch,7), BIT(ch,6), BIT(ch,5), BIT(ch,4), BIT(ch,3), BIT(ch,2), BIT(ch,1), BIT(ch,0));
まあ確かにビットマスク使ったほうが楽だな
305 :
デフォルトの名無しさん :2008/05/04(日) 17:45:50
コマンドプロントでテキストファイル.Cをコンパイルするにはどうすればいいの? パスはしたの通りです。 C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C C:\Bディレクトリ\コンパイラ
> コンパイラ /? > コンパイラ /H $ コンパイラ -h $コンパイラ --help
307 :
デフォルトの名無しさん :2008/05/04(日) 18:53:08
えwどういうことw
>>307 コンパイラによって方法が違うからコンパイラのマニュアルを見るか
有名なコンパイラなら名前を書け
ヘルプ見ろ
310 :
デフォルトの名無しさん :2008/05/04(日) 19:05:39
え そうなんだ MinGWなんだけど
MinGWならgccかな > C:\Bディレクトリ\コンパイラ が気になるけどたぶん gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C どっちかかもね?
gcc --help と叩けば使いかたが出る。
313 :
デフォルトの名無しさん :2008/05/04(日) 19:31:39
> C:\Bディレクトリ\コンパイラ は C:\TYC4TH\gcc ってことです その二つでためしたんですが、 gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cの場合 'gcc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cだと 'C:\TYC4TH\gcc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません
314 :
デフォルトの名無しさん :2008/05/04(日) 19:33:02
ってでます><
315 :
デフォルトの名無しさん :2008/05/04(日) 19:39:10
>>312 なんか英語がたくさんでて意味がわからない・・・
日本語を含む場合は""で括る 例)gcc "C:\Bディレクトリ\コンパイラ" >'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。 gccコマンドのパスが通っていない、正しくない
gccインストールしてからMinGWインストールすると パス通すかの確認があった気がしたけど・・・ MinGWをインストールしなおして確認してみるか、 $HOME/.bashrcにexport PATH=$PATH:コンパイラの入ってるディレクトリ を追加してみ MinGWコンパイラの入ってるパスは$HOMEからの相対パスがいいかな ちなみにMSYSも入れるとうれしくなれるかも
>MinGWコンパイラの入ってるパスは コンパイラの入ってるパスは 訂正
>コンパイラの入ってるパスは コンパイラの入ってるディレクトリは 打つ出し脳
MinGW - Minimalist GNU for Windows OSはWindowsじゃないの? XP なのか 9x なのかによっても設定方法違うけど
c:\autoexec.batに PATH=c:\MinGWまでのディレクトリ\bin;%PATH% これを書き込んで再起動すればばよかった、、、はず・・・多分
323 :
デフォルトの名無しさん :2008/05/04(日) 20:19:39
おぉ できたかもです!! みなさんありがとうございます。 さっそく勉強してきます。
324 :
デフォルトの名無しさん :2008/05/04(日) 20:51:46
#include <windows.h> typedef HRESULT (STDMETHODCALLTYPE *LPFNGETCORSYSTEMDIRECTORY)(LPWSTR, DWORD, DWORD *); int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { WCHAR szBuf[256]; DWORD dwLength; HMODULE hmod; LPFNGETCORSYSTEMDIRECTORY lpfnGetCORSystemDirectory; 略 lpfnGetCORSystemDirectory = (LPFNGETCORSYSTEMDIRECTORY)GetProcAddress(hmod, "GetCORSystemDirectory"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (lpfnGetCORSystemDirectory == NULL) { MessageBox(NULL, TEXT("関数がエクスポートされていません。"), NULL, MB_ICONWARNING); FreeLibrary(hmod); return 0; } 略 } 上記のようなプログラムを見かけましたが波線の部分関数ポインタの動作いまいち理解できません。 どなたかご教示お願いします。
>>293 以下の記述で普通に動作しています。
環境 cygwin/WindowsXP, 処理系 gcc 3.4.4
#include <stdio.h>
#define N 1024
int main()
{
char buffer[N], *p;
p = buffer;
fgets(p, N, stdin);
printf(">%s", p);
return 0;
}
/* end */
動作しないソースと環境・処理系を教えていただければ、何かわかるかもしれません。
326 :
325 :2008/05/04(日) 21:54:30
失礼、解決ずみでした。
>>324 関数ポインタとは動作するものではありません
もう少し質問内容を吟味してくださらないと答えようがありません
328 :
デフォルトの名無しさん :2008/05/05(月) 04:08:44
>>324 GetProcAddress は指定した関数へのアドレスを返すんだけど、
GetProcAddress の戻り値の型は1つに定めないといけないので
GetProcAddress は関数へのアドレスをとりあえず FARPROC って型にして返すようにしてある。
実際にこの関数のアドレスを使う際には、
本来の関数ポインタ型へとキャストして使う必要がある。
stdlib.hにあるsystem関数って、標準ですか? どの処理系でもまともな動作が期待できる?
>>331 プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。
質問がとんでもなく飛んでいる。
どの処理系・・・列記してみて
まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)
>>324 このソースって凄いね(大文字ばっかで・・・w)
関数のポインターについてだけど
ポインターはアドレスを示すのは判りますね。
int body1(char* mes)
{
printf("body1 : %s¥n", mes); return 0;
}
int body2(char* mes)
{
printf("body2 : %s¥n", mes); return 0;
}
{
int (*func)(char*);
func = body1;
func("message");
func = body2;
func("message");
}
みたいな。
lpfnGetCORSystemDirectory は関数へのポインターを示すけど希望するのがなければ NULL。
あとlpfnGetCORSystemDirectory() として適当に引数与えて呼び出せばいいということかな。
>>331 関数そのものは標準であり、
どの処理系であろうと「処理系の考えるところのまともな動作」をする
それが「プログラマの期待するところの動作」と一致するかはわからない
336 :
デフォルトの名無しさん :2008/05/05(月) 16:02:52
ここのレス見ても何も分からないほどの初心者ですが教えてほしいことがあります。 課題でこのプログラムを組まないといけないのですが、全く分かりません。 問、二次元配列のプログラムを利用し、行列の積を計算するプログラムを作成せよ。 ただし行列a,bは以下のものを使用する。 |0 1 2| |0 3 6| a=|3 4 5| b=|1 4 7| |6 7 8| |2 5 8| aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
>>336 >aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
行列の積の定義から勉強しような。
行と列が逆だと思うぞ。
338 :
デフォルトの名無しさん :2008/05/05(月) 16:23:36
>>337 すいません。丁寧に指摘してくださってありがたいです。
一応僕が作ったプログラムを載せておきます。
#include<stdio.h>
main(){
int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
int b[3][3]={{0,3,6},{1,4,7},{2,5,8}};
int c[3][3]={0};
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
c[i][j]=a[i][j]*b[i][j];}
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",c[i][j]);
printf("\n");
}}
足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、
どうすればよいのでしょうか、あつかましいですがよろしくお願いします。
339 :
側近中の側近 ◆0351148456 :2008/05/05(月) 16:28:36
(っ´▽`)っ #include <stdio.h> int main(void) { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}}; int ab[3][3]; int i; int j; int k; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ ab[i][j] = 0; for(k = 0; k < 3; k++){ ab[i][j] += (a[i][k] * b[k][j]); } } } return 0; } 答えは{{5, 14, 23}, {14, 50, 86}, {33, 86, 149}
>>338 行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。
for(n = 0; n < 3; n++){ for(m = 0; m < 3; m++){ for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m]; } } こんな感じ?
342 :
側近中の側近 ◆0351148456 :2008/05/05(月) 16:33:49
>>338 (っ´▽`)っ
x行n列の行列Aのi行j列成分をa(i, j)、
n行y列の行列Bのi行j列成分をb(i, j)、
ABのi行j列成分をab(i, j)と表示するとき、
ab(i, j) = Σ(k=1→n)a(i, k)b(k, j)
線形台数の教科書を見直せ☆
343 :
デフォルトの名無しさん :2008/05/05(月) 16:51:00
>>339-
>>342 初歩的なことなのにわざわざ教えてくださってありがとうございます。
感謝しています。
あとほんとに初心者的なことなんですが、
>>339 さんのプログラムで計算は出来ました。
しかし答えを表示させようと思ったら、なんか変な結果になりました。
以下プログラムと結果です。
(最初のほうは省略)
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
printf("%d ",ab[i][j]);}
}
}
return 0;
}
結果
0 1 5 0 4 14 0 7 23 0 4 14 9 25 50 18 46 86 0 7 23 18 46 86 36 85 149
344 :
デフォルトの名無しさん :2008/05/05(月) 16:52:39
345 :
344 :2008/05/05(月) 16:54:36
>>342 ごめんなさいゆとりは俺でした
数学3cじゃねええええええええええ
あああああああああああああ何か勘違いしてたああああああああ
346 :
344 :2008/05/05(月) 16:55:21
やべえ今までで一番恥ずかしい書き込みだ
最近Cを始めた者なんですが CってVBにあったLEFTやMIDに当たる関数はないのでしょうか? ポインタを使うような関数を自分で作る必要がありますか? 何かサンプルなどもありましたらお教えください。
348 :
336 :2008/05/05(月) 16:55:51
僕はちなみに本当のゆとりです。
落ち着け 寿司食うか?
350 :
344 :2008/05/05(月) 16:58:16
大体3cとかあんまりやってねぇんだよ・・・ ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ? 行列式はなかったよな・・・あぁ・・・俺なにやってんだろう
> ab[i][j] += (a[i][k] * b[k][j]); > printf("%d ",ab[i][j]);} ~~~ 中括弧の位置
352 :
側近中の側近 ◆0351148456 :2008/05/05(月) 17:03:14
>>343 (っ´▽`)っ
printfを最も内側のループの外に出せ☆
#include <stdio.h>
int main(void)
{
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
int ab[3][3];
int i;
int j;
int k;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
}
printf("%d\t", ab[i][j]);
}
printf("\n");
}
return 0;
}
353 :
344 :2008/05/05(月) 17:05:08
ああああああああああああああああああああああ
354 :
344 :2008/05/05(月) 17:06:41
ダメだ・・・
五月蝿い トイレでも篭ってろ
356 :
344 :2008/05/05(月) 17:08:42
線形台数の教科書読んできますノシ
>>347 >CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ない
>ポインタを使うような関数を自分で作る必要がありますか?
ある
文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること
まずCのやりかたというものを覚えるのが先
358 :
側近中の側近 ◆0351148456 :2008/05/05(月) 17:12:08
>>347 (っ´▽`)っ
b = LEFT(a, n)
は
strncpy(b, a, n);
b[n] = '\0';
b = MID(a, m, n)
は
strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0'
で。
359 :
側近中の側近 ◆0351148456 :2008/05/05(月) 17:13:30
(っ´▽`)っ 最後セミコロンが抜けたが気にしない☆
>>347 >CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
どちらもsprintf()で代用可能。
361 :
336 :2008/05/05(月) 17:14:14
>>351-
>>352 おかげさまでうまく答えも出ました。本当にありがとうございます。
362 :
344 :2008/05/05(月) 17:14:54
363 :
347 :2008/05/05(月) 17:17:36
>>357-360 ご回答ありがとうございました。
サンプルを参考にしながらC勉強をしていきます。
364 :
側近中の側近 ◆0351148456 :2008/05/05(月) 17:23:39
(っ´▽`)っ 正確には (っ´▽`)っ b = LEFTB(a, n) は strncpy(b, a, n); b[n] = '\0'; b = MIDB(a, m, n) は strncpy(b, &a[m-1], n-m+1); b[n-m+1] = '\0'; だ。 strncpyの第3引数はバイト数。 LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。
365 :
336 :2008/05/05(月) 17:35:16
366 :
デフォルトの名無しさん :2008/05/05(月) 17:44:26
unsigned __int32 hentai, doutei; hentai = 293317826; doutei = 899523; 仮に上のように hentai と doutei に格納された数値において、 hentai += doutei; // 293000000 + 899253 のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。 条件は if ( hentai > doutei && doutei >= 0 && doutei < 1000000) で、思いついたのが hentai = ((hentai / 1000000) * 1000000) + doutei; 納得がいかないのでスマートなやり方教えてくれ。
>>366 十分スマートと思うが、どういう点で納得がいかないんだ。
hentai += doutei - hentai % 1000000;
368 :
デフォルトの名無しさん :2008/05/05(月) 17:58:57
>>367 おお、サンクス。
除算か乗算どちらかを一回でも削りたかったんだ。
>>363 Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな?
>>360 参考までに書いてくれると周りも参考になるとおもう。
せいぜい数行だと思うから sprintf で書いてみてよ。
>>369 360じゃないが、こうじゃないかな。
char* left(char *dst, const char *src, int count)
{
sprintf(dst, "%.*s", count, src);
return dst;
}
char* mid(char *dst, const char *src, int pos, int count)
{
return left(dst, src+pos, count);
}
C言語用でお勧めのフリーコンパイラを教えてください
>>371 ・ GCC (MinGW)
・ Microsoft Visual C++ Express Edition 2008
好きなの選べ
374 :
デフォルトの名無しさん :2008/05/06(火) 00:05:01
>>373 その2つの違いがまったくわかりません…
それとMSの方はC++となってますがC言語にも対応してるんですか??
おまえは紹介されたコンパイラについてちゃんと調べたのか?
>>374 MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。
gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。
まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。
377 :
デフォルトの名無しさん :2008/05/06(火) 00:24:49
fputc( )の使い方の説明で int fputc(int 文字、FILE *ストリーム); fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。 とあるんですが、上位バイトはどうなるんですか?
捨てられる
vistaで動くコンパイラだったら何がいい? やっぱりbcc、gcc辺りかな
VC++ 2008 Express Edition
382 :
デフォルトの名無しさん :2008/05/06(火) 09:53:56
uint16 とか uint8 とかは int とどう違うのですか? 使い方を教えてください。
Express Editionとgccの好きな方
uint16_t や uint8_t なら標準(C99)で用意されているが uint16 や uint8 は標準では用意されていない。
385 :
382 :2008/05/06(火) 09:59:52
>>385 標準で用意されてない以上、
ヘッダファイル内にある定義を見てくださいとしか言いようが無い。
387 :
382 :2008/05/06(火) 10:22:11
>>386 ということは・・・
uint16 uint8 はwindows.hとかでも定義されてる分ではなく、
自分の使っているライブラリかなにかで定義されているということですね。
わかりました。 調べてみます。
>>387 windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。
そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。
処理系独自に定義されてるかもしれないが、 どの処理系使ってるかも知らんし、 結局自分で調べてくれ、というこった。
struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram hist); int main (void){ struct histgram hist; int z; hist.x = 0; for(z=0;z<100;z++){ hist.y[z]=0; } printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); one(hist); printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); for(z=0;z<9999999999;z++); return 0; } void one(hist){ two(hist); void two(hist){ int z; hist.x = 1; for(z=0;z<100;z++)hist.y[z]=1; } とするとtwo(hist)でエラーが起きます。なぜでしょうか?
すいません、解決しました。
INT_MAX 4bites = 2147483647 < 9999999999
やっぱうまくいきません。 struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram hist); int main (void){ struct histgram hist; int z; hist.x = 0; for(z=0;z<100;z++){ hist.y[z]=0; } printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); two(hist); printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); for(z=0;z<9999999999;z++); return 0; } void two(struct histgram *hist) { int z; hist->x = 1; for(z=0;z<100;z++){ hist->y[z]=1; } } は何がいけないのでしょうか?
two()は構造体のポインタを受け取る関数 main()で呼んでるtwo()に渡されてるhistは構造体そのもの あと>392
bites …くそorz
Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい
397 :
393 :2008/05/06(火) 14:11:59
398 :
393 :2008/05/06(火) 14:12:39
>396 ありがとうございます。使ってみます。
#define ZETTAI(x) (x < 0) ? -(x) : x int x; x = ZETTAI(-9 - 50) + 5; これでxの中身が59になってしまうのですが、何故でしょうか? -59をZETTAIで59にした後、5を加算しているはずなのですが
>>.397
そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、
ポインタを引数としてとるseidesp2()にそのまま渡すことができる。
>>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。
>グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
>処理された任意の変数をn個、n-1個上の階層で使用したいのですが
言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。
コンパイラのエラーメッセージをちゃんと読め。 プロトタイプ宣言と定義が噛み合っていないぞ。 void two(struct histgram hist); void two(struct histgram *hist)...
>>399 x = ZETTAI(-9 - 50) + 5;
↑は↓のように展開されるから。
x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
これはもちろん
x = (-59 < 0) ? 59 : -54;
と解釈されて、xには59が代入される。
マクロZETTAIの正しい宣言は下のようになる。
#define ZETTAI(x) ((x < 0) ? -(x) : x)
もちろん自作などせずにライブラリ関数を使うことが望ましい。
>>399 #define ZETTAI(x) (x < 0) ? -(x) : x
を
#define ZETTAI(x) (((x) < 0) ? -(x) : (x))
にしておてきなさい。
>>402-403 上手くいきました
ありがとうございます
ですが、
>x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
同じxなのに何故一番右のxだけに+5がくっつくのですか?
405 :
393 :2008/05/06(火) 14:30:43
すいません、結構理解に手こずってます。 配列でなく、実体を受け渡しする場合は、 struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram *hist); int main (void){ struct histgram hist; int z; hist.x = 0; printf("before***%d***%d***%d***",hist.x); one(&hist); printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]); return 0; } void one(struct histgram hist){ two(&hist); } void two(struct histgram *hist){ int z; hist->x = 1; } だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。 というエラーが出てしまいました。
>>404 元のx=の式の一番右の+5がそのまま残っているだけ。
>>405 構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。
>>406 つまり
#define ZETTAI(x) (x < 0) ? -(x) : x を
#define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると
x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が
x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね?
#define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと
x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね!
理解できました
丁寧にありがとうございました
まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。
いいから黙ってstdlib.h::abs()を使え
やっぱ自作するより、ライブラリ探したほうがいいのかな
absはintだから・・・
そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。
>>399 悪いことはいわん。inline 使え。
#define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?
inline は C99 からだから
>>415 そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?
VC++ は C89 だ
まぁ、最適化を当てにして関数にしておけってのはありだがな。
419 :
デフォルトの名無しさん :2008/05/07(水) 08:24:58
すみません質問させてください。 入門書見て書いてるんですが #include <stdio.h> int astoi(const char s[]) { int i; int number = 0; for(i = 0; s[i] >= '0' && s[i] <= '9'; i++) number = 10 * number + (s[i] - '0'); return(number); } int main(void) { char x[]= "1234"; printf("%d", astoi(x)); return(0); } という文字型を数値に変えるプログラムで、 number = 10 * number + (s[i] - '0'); のところで (s[i] - '0') とあるんですがこれはどういう意味なんでしょうか? この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。
>>419 文字を数値へ変換してる
asciiコードとかがポイント
誰か
>>414 の
>#define は C言語ではない
の意味を説明してくれないか?
>>421 プリプロセッサの範疇だと言うことだろ。
>>419 s[i]というのは文字コードが格納されている
'0'というのも、数値の0ではなくて文字0の文字コードが格納されている
'1'は'0'より文字コードが一つ大きいんだ
つまり'1'から'0'を引けば数値の1が返るという仕組み
424 :
デフォルトの名無しさん :2008/05/07(水) 13:12:40
>>419 ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ!
ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。
コンパイラが扱う範疇ではないがC言語の範疇には入るんじゃまいか?
426 :
419 :2008/05/07(水) 14:49:58
asciiコード!そういう仕組みなんですか・・・僕友達いないんで、ここで聞かなければ絶対わかりませんでした。 レスしてくれたみなさん、ありがとうございました!
プリプロセッサも、C標準に規定されている訳だし、 C言語の一部と考えてもいいんじゃないかな。 プリプロセッサがなきゃコメントすら書けん
>>426 せめてGoogleくらいは味方にしておこう。
プリプロセッサの問題点はC言語の一部かどうかじゃなくて コンパイラと完全に独立しているところ
問題点ではないだろ
問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。
プリプロセッサ部がCと強く結びついてるからなんだけどマクロの多用はどうかという一意見だす。 #include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・ ただ #define で色々マクロ組むのはどうかな。 美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。 #define CONSTANT_VAL 50 ではな const int CONSTANT_VAL = 50; こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。
それは別に警告出ないと思う。 マクロは使わなくていいなら使わない方がいいってのは賛成だが、 C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。
プリプロセッサディレクティブを勉強して間もない俺とするとすごい便利だと思うんだけど・・・ 引数の型気にしなくてもいいマクロとか素敵じゃない?
マクロはどう展開されてどう実行されるのかを理解して無いと バグを生むことがあるってのがアレなんだろうね
そんなとうにされつくしてる議論してんなよ・・・・・・・・
>>436 入門篇って書いてあるし、議論すればえ〜ねん
>>433 私はこのレベルの警告を出すようにしてる。
>>434 そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。
#defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど
a = -3;
k = abs(a++);
結果は悲惨になるけど気付きにくいでしょ?
これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。
C++ だとそれを何とかするために関数テンプレートが導入されたが、 C だとやっぱどうしてもマクロになっちゃうんだよなあ。
440 :
434 :2008/05/07(水) 20:24:50
>>438 マクロの怖さを頭ではなく心で理解したわ
ABSにすれば解決
馬鹿が使えば包丁も自動車も凶器になる。
>>435 それを言ったら無知と無理解はなんだってバグのもとだろ
所詮人間一人なんてちっぽけな存在さ。自分一人なんて この世の60億分の1に過ぎない存在。万能、全知全能、 絶対権力者の人間なんて存在しない。 人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。 そんなもん。だから、気ぃ張るなや、適当に生きろ。 どうせお前が強がっても、地球の運命までは変えられないから。 せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ 出来んやろ?なっ?俺はずっと共産党に投票してたけどな。
マクロを使うと一見上級者のようでかっこいいんだけどね 地道に関数でということかな
ふっ、例えポルシェやBMWを運転していようが、軽自動車を運転していようが 同じ道路交通法が適用されている道で守るべきルールは同じさ。 それよりも、ドライバーの運転技術はいかがなものか?他に、 アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が 加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。
ええいお前のたとえは分かりにくい
>434 型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。
>>434 昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・
昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。
FORTRANなら普通の事です
>>445 マクロ使っても全然上級者には見えないから安心して関数を使おう
可読性、保守性の高いソースを書く人のほうが上級者に見える。 まあマクロはその手段の一つなんだけれども。
浮動小数点の定数って定義できるんだっけ? C++でも未だにマクロ使ってるんだけど
別に定数を定義することくらいはできるけど。 ただ、初期化順でハマることはあるかもしれないね。
voidポインタの参照先はビットシフトできないのかな?
>>456 void*をint*にキャストしてシフトすれば?
>>456 何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。
キャストしたらできた! これって任意のバイト数を指定することはできないのかな? mallocで指定しても駄目だったし無理か・・・
>>459 > これって任意のバイト数を指定することはできないのかな?
意味不明
void*の参照先を任意のビット幅としてビットシフトしたいんです
自分でそういうプログラム書け。
ビットシフトすりゃいいじゃん。
>>463 void*の参照先ですか?
intとかcharとか不定です
void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・
とりあえずバイトオーダをはっきりしておかないとな。 リトルエンディアン環境の場合、数十バイトだろうが その全体でリトルエンディアンになることを仮定していいのか、 それとも4バイト単位でリトルエンディアンになることを仮定するのか。
>>465 char*にキャストして一バイトごと表示しろよ
>>466 リトルエンディアンだとおもう
よくわからないから続きはwebで勉強してくるわ
>>467 おk試してみる
>>461 できない
ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない
どうしてもやりたいなら自力でそのような関数を作るしかない
キャストすればいくらでもできるだろ・・・。
>>470 んなアホな
charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ
もしかしてデータ圧縮なんかで使うビットごと入出力でも作ってんのかな それだったらlhaの解説書見れば早いと思う
>>473 「ビットシフト」の言葉の食い違いだったようだ
俺が考えてたのは組み込みのビットシフトのことね
そっちは概念としてのビットシフトだよな
> 組み込みのビットシフ なんじゃこれは?ト
476 :
デフォルトの名無しさん :2008/05/08(木) 02:38:42
プロトタイプ static void mera(const char *); このとき 1) void mera(const char *merami) 2) void mera(const char* merazooma) 1だけのはずが 2のようなものも通ってしまうのはどうして? どちらでも良いという意味ならば、どちらが推奨なの? また、 static void bagi(const char ****); このとき 1) void bagi(const char ****bagima) 2) void bagi(const char**** begiragon) どちらも警告W8075程度で通してしまうのはどうなの? BCC5.5.1
>>476 > 1) void mera(const char *merami)
> 2) void mera(const char* merazooma)
1) は C に多く、2) は C++ でみます。
どっちでも大差ないと思います。
スペースがあるかないかだけじゃん。何で違うものだと思うの?
>>476 char *p も char* p も意味は同じ
スタイルについては、変数の宣言時にたとえば
char* p, * q;
などとするのが不自然という理由で
char *p, *q;
を推奨する人は多い
追記 一方で char* p; を推奨する人は、変数名はあくまでpであるから それがchar*であることを示すためにそうすると主張することが多い ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名]; だから int const n, m; とは書けても char* p, q; とは書けない)ので、 構文的には変数名側に寄せることが正しい扱いであると言える
×ただし*はcharやint、あるいは ○ただし*はcharやintのようなデータ型、あるいは
もちろんスタイルの話だから、君はchar* pと書いてもいいし、char *pと書いてもいいし、さらにはchar * pと書いてもいいし、 また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい
たくさんのレスありがとう、勉強になりなす。
>>476 ×begiragon
○bagicross
なんで誰も指摘しないんだよー
>>448 エスケープシーケンスを正しく読めばいいんじゃないかな
確か0x1bだったっけ? この次の文字は制御文字だから、それに応じた処理をすればいい。
カーソル位なら入力されたコードをじっくり眺めればすぐに分かると思うよ
487 :
448 :2008/05/08(木) 19:42:21
>>486 そうだったのかー!!
あれはエスケープシーケンスと制御文字が組み合わさってたん
ですね。だからあのプログラムで[Aとかが表示された訳だ。
どうもです。
XPでコンソールのカーソルを移動させるにはどうすればいいの?
スレ違い
mallocして帰ってきたポインタをfreeするとメモリを開放するらしいのですが、 freeにサイズを書かなくてなんでサイズがわかるんでしょうか。 #include <stdio.h> void main() { char *c; c = malloc( 10 ); if( c == NULL )return; strcpy( c , "aiue" ); c--;//ひとつ前のポインタ(サイズは書いていないようだ) c--;//ここにもサイズはない c++;c++;//元に戻す free( c ); c = NULL; return; }
493 :
491 :2008/05/08(木) 21:52:55
>>492 ポインタの前ではなくほかのところにあったんですね。
どうもありがとうございました。
どうでもいいけど、ポインタを戻すのはよろしくないんじゃね?
実際に確保されていることが確実な範囲(+1)を超えた演算の結果は保証されてなかった気がする
>>492 ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら
int* ip = (int*)c;
long* lp = (long*)c;
こうしておいて
printf("%d : ", *(ip - 1)); // c 先頭から int 分戻った場所から数値として表示
printf("%ld : ", *(lp - 1)); // c 先頭から long 分戻った場所から数値として表示
こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)
>>493 > ポインタの前ではなくほかのところにあったんですね。
それは処理系依存。
ポインタの前にある場合もあるだらう。
498 :
デフォルトの名無しさん :2008/05/08(木) 23:11:55
じゃああんま頻繁にmallocすると、逆に管理テーブルのぶんムダ使いになるんですかね??
管理テーブルを保持することよりも、 空きメモリを探す処理とfreeの分、 CPU時間の無駄遣いになることを気にしたほうがいい気がする。
ということはlinked listとかすごい効率悪いんだな・・・ ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?
実装によるとしか mallocのソースでも眺めてみれ
入門書クリアしたら次は何がいいかな? アルゴリズム辞典とか眺めるの?
linked list はスタック上にメモリをプールしておけばいいぜ。
×スタック上 ○スタック状
>>502 良いソースを読むことだと思う
どの言語でも同じだと思うが
何か作りたいものがあるから学んでいるのでは? それを作るのにまだ足りないものがあるならそれを学べばOK 足りてるなら作ろう
実際に自分の目的とするものを作ること その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること 言語仕様がわかってても要求を実現できない新人多すぎ コーダーじゃねぇんだからさ
0か1を要素にもつN次元のベクトルv(Nビットの情報ベクトルv)を入力した時 N個の要素はそれぞれ、確率pで0は1に、1は0に変わってしまい、また確率eで情報が消失する。 (消失した情報は2を代入すればよい) 上記の手続きを行い、画面にベクトルv'を出力(消失した要素はXを出力) というプログラムを整数の配列と擬似乱数で作りたいんですが、↓では数字がおかしくなってしまいます。 環境はunixのgcc 4.0.2です、初心者ですがご指導よろしくお願いします。 なお、ここではN=5、e=0.05、p=0.1としています。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 ; int main(void) { int v[N], u[N] ; int i ; float e, p, x ; for (i = 0; i <= N-1 ; i++ ) { printf("v[%d]=",i) ; scanf("%d",&v[i]) ; while (v[i] && v[i]!=1) { printf("v[%d]=",i) ; scanf("%d",&v[i]) ; } }
p = 0.1 ; e =0.05 ; for(i = 0 ; i <= N-1 ; i++) { srand(time(NULL)); x = (float)rand()/ 32768.0 ; /* xは0以上1未満の乱数 */ if( x < p ) { u[i] = (v[i]+1) % 2 ;} /* xが0以上p未満の時、受信に誤りが生じる */ else if( x >= p && x < p+e ) { u[i] = 2 ;} /* xがp以上p+e未満の時、情報は消失(2を代入) */ } printf("(") ; for(i = 1 ; i <= 7 ; i++) { if (u[i] == 2) printf("X ") ; else printf("%d ",u[i]) ; } printf(")\n") ; return 0 ; }
p = 0.1 ; e =0.05 ; for(i = 0 ; i <= N-1 ; i++) { srand(time(NULL)); x = (float)rand()/ 32768.0 ; /* xは0以上1未満の乱数 */ if( x < p ) { u[i] = (v[i]+1) % 2 ;} /* xが0以上p未満の時、受信に誤りが生じる */ else if( x >= p && x < p+e ) { u[i] = 2 ;} /* xがp以上p+e未満の時、情報は消失(2を代入) */ } printf("(") ; for(i = 0 ; i <= N-1 ; i++) { if (u[i] == 2) printf("X ") ; else printf("%d ",u[i]) ; } printf(")\n") ; return 0 ; }
>>508 srand をループで毎回実行しない。最初の1回だけで良い。
32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。
x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?
512 :
508 :2008/05/09(金) 18:36:04
>>511 その場合u[i]は変化しません。
擬似乱数間の扱いが違ってましたか、勉強になります
513 :
508 :2008/05/09(金) 18:38:06
あ、変化しないんだから u[i] = v [i] ; ですね。なんという初歩的なミス、ありがとうございました。
久々に突っ込みどころ満載なコードを見た気がする
517 :
デフォルトの名無しさん :2008/05/09(金) 22:54:01
本はいらないよ ネットのほうがいい それに基礎いくらやってもWindows(UNIX)アプリは作れない。 標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ
>>516 それ買っておきなさい。
ネットのは怪しいのが多い。
しかし洋書はたけえな。
>>516 お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ
C言語そのものはとてもシンプルだと言うこと #include によってもたらされる先輩方の資産と情報に振り回されない 目的をもってプログラムに取り組む ・・・ 例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。 ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。 どちらにしても有る程度は知識得ないといけない訳だけど。
522 :
デフォルトの名無しさん :2008/05/10(土) 00:05:42
自分見やすい(辞書)サイトを保存しておいて、AND OR NEARなどで全文検索しようぜ
524 :
デフォルトの名無しさん :2008/05/10(土) 00:10:00
たとえば、空き実メモリの容量を知りたければ、 メモリ 容量 などで検索する。
シンプルに見えて実はぐちゃぐちゃ それがC
Cをちゃんと理解したかったら、コンパイルした先のアセンブラと対比させるのが一番だと思う。 それが可能なのがCの最大の利点であり最大の欠点だから。
まず独習かダイテルあたりのしっかりした入門書で基礎仕様の理解を押さえる その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分
528 :
516 :2008/05/10(土) 08:23:53
レス色々ありがとう。
自分はプログラミングはちょっとやったことありますが、C言語に
ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、
って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。
だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと
思ってます。
>>523 こういうスレがあったんですね。ありがとうございます。
ただの趣味だからって、効率悪くてもなるべく自作するようにしてる俺エドモンド本田
530 :
デフォルトの名無しさん :2008/05/10(土) 16:04:28
複数行文字列(100行以上)を標準出力に書き出す際、 \ で複数行まとめて書くとインデントが使えず見辛い。 別の方法を考えたところ 1) printfで一行ずつ printf("黒い0服\n"); printf("お茶を1杯\n"); 2) fputsで一行ずつ fputs("赤い2んじん\n", stdout); fputs("橙色の3かん\n", stdout); 3) 配列に格納してwhile puts char *memo[] = { "黄色い4んごう", "五月みどり", "" }; char **memop = memo; while(**memop) puts(*memop++); (1) や (2) は解かりやすいが、(3) の方が見やすい。 ただ (3) のままだと宣言初期化時しか格納できない。 ・分岐後に文字列を格納したい。 ・strcpy は使用を控えたい。 悔しいのでスマートな書き方教えてくれ。
printf("黒い0服\n" "お茶を1杯\n"); でいいよ
別のテキストファイルにして読み込む マジおすすめ
あぁでもprintfに直接文字列は推奨されないよ %入ってるとまずいからだけど
putsでいいだろ
そこでfputsですよ
ABC & 上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは どの様にすればいいのですか?
それはシェルの役目
538 :
デフォルトの名無しさん :2008/05/10(土) 16:45:35
>>531 あぁ , 無しで繋げられるのだっけか。
でも , をつけてしまいやすいので使い方だけ覚えとく。
>>532 ,533
メモっとく。
>>534 puts("青6し");
puts("むらさき7ぶ");
か
puts(
"むらさき7ぶ\n"
"灰ヤー"
);
のような感じか。
もう少し考えてみるわ、サンクス。
本題より例文が気になって仕方がない。むらさきしちぶ?
抵抗のカラーコードの語呂合わせだろ。 俺は「青二才のろくでなし」って覚えているんだけど。
失礼しms。
ttp://www.uploda.org/uporg1415339.c.html 上記のようなコードを書いたのですが、
bの領域を解放するときに
”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。”
のようなエラーが出てしまいます・・・。。。
確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、
double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか?
またそのせいでこのエラーがおこっているのでしょうか?
ご教授願います。よろしくお願いします。。。
>>541 > memmove(b, a, sizeof(a[0])*sizeof(a[0][0]));
これのせいで同じ領域を二回 free している
543 :
541 :2008/05/10(土) 20:38:45
>>542 memmoveだとだめなのでしょうか?
>>543 何がやりたいかによる
a[y][x] に格納されている double の値をコピーしたいのであれば
for(y=0;y<N;y++) memmove(b[y], a[y], N*sizeof(a[0][0]));
545 :
541 :2008/05/10(土) 20:45:19
やりたいことはその通りなのですが、今の状態だとポインタをコピーしてる状態ということでしょうか?
>>545 V / / _,, ァ=ニニ:} _
.V /,.ィ"f= <r'ニ三{ |_ ┐ _l_ l
'vf^<''" 弋z.ミ'テtフ |_ Х □_ 匚 L | У
〉!ト _ i{ ´ ̄r' =|'
./ェ゙‐ェi. 、__`_ヤ ( その通りでございます )
./iュ.Hヽ.、 ゙,ニ/
-^ ー'-.、,i._`ヽ,.仁リ
ー - .、 /、
>>542 ,544,546
なるほどです。つながりました。ありがとうございました><
548 :
デフォルトの名無しさん :2008/05/11(日) 01:50:19
初心者です。すみませんがアドバイスお願いします。 char (*pacX)[3]; とした場合、pacXは3要素のchar配列へのポインタになると思いますが、 このような変数「の配列」を以下のように動的に確保するとします。 int iNum = 2; char (*pacX)[3] = new (char)[iNum][3]; この場合、ポインタ変数が2つ(iNum分)確保されるのでしょうか。それとも、それらが指す3要素のchar配列2つ分のメモリまで確保されるのでしょうか?
typedef して考えてみよう。 typedef char CharArray3[3]; CharArray3* pacX = new CharArray3[iNum];
newてC++やん
551 :
デフォルトの名無しさん :2008/05/11(日) 02:13:33
>newてC++やん
すみません、確かにそうですね。
>>549 なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね?
イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば
delete [] pacX;
とすることで開放されるということよろしいでしょうか?
で
553 :
デフォルトの名無しさん :2008/05/11(日) 02:28:42
>>548 その記述ちょっと気色悪い。一歩間違うと関数へのポインターと見間違えちゃうし。
int (*func)(int k); // 関数へのポインター
int a1(int k) { printf("%d¥n", k * 5); return k; }
int a2(int k) { printf("%d¥n", k / 5); return k; }
int main()
{
func = &a1;
func(k);
func = &a2;
func(k);
}
みたいな・・・
普通に char *a[3]; でいいと思うけど。
>>554 内容が理解できない人は黙っておいた方がいいよ。
char *a[3] ポインタの配列 char (*a)[3] 配列のポインタ
CGIにC使ってる人ってあまり見かけないんだけど、CでCGIってダメダメなの?
実行速度的には悪くないけど、LLに比べるとテキスト処理が面倒なのと、非セキュアになりやすい(バッファオーバーフローとか)からじゃないかねぇ。
単にcコンパイラ使わせてくれる鯖が少ないからじゃないの?
>>559 どの言語が用意されているかというのは、Web制作板的な視点じゃないか
プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。
>あまり見かけないんだけど とあったからそれに沿うように答えただけなのだが。 性能的には何ら問題ないと思う、とつけたほうがよかったかな?
なぜCコンパイラ使わせてくれる鯖が少ないか、
というところまで考え出すと、
結局
>>558 に行き着くんじゃないかと思う。
563 :
デフォルトの名無しさん :2008/05/11(日) 11:41:06
数列の最大値を計算するアルゴリズム 数列:0、3、1、4、7、2、8 お願いします。
宿題丸投げは宿題スレへ
566 :
デフォルトの名無しさん :2008/05/11(日) 12:00:34
><
>>563 max(0, max(3, max(1, max(4, max(7, max(2, max(8)))))));
><
568 :
デフォルトの名無しさん :2008/05/11(日) 14:42:42
適当に数字を入力して その数字をまたある数で割って割り切れたらその値を出力して 割り切れなかったら余りだけをまた別の小さい値で割りきれるか って繰り返して最終的には割り切れるプログラムを作りたいんですが・・・ 例えば1020を500で割ると2余り20で2が出力され 余り20を10で割って2が出力されるみたいな ヒントでもいいんでお願いしますm(_ _)m
その日本語を1行ずつCに翻訳していけばいいと思うよ
ってある数で割るって何で割るんだよ 1020を1020で割って余り0で終了、じゃだめなの
意味が分からん ある数って何だよ 入力した値か?
>>558 速度的にはアレなんじゃね?
スクリプト系のmod_*みたいな仕組みってCでは一般的でないし。
2chは、やってるみたいだけど。
568です 説明が下手ですいません レジのおつりを渡す要領で 適当な値を入力して500、100、10、1で各々割って何が何枚必要か求めたいんです
どこが分からないのかわからない。 それをそのままコードに落とせばいいだけだろ
つりの硬貨の枚数が最小になるようにとか、なにがしかの条件がついてるけど、それが説明できてないんだろ?
こうだろ #include<stdio.h> int main() { static const int coin[] = {500,100,50,10,5,1,0}; int price, i; printf("金額は?"); scanf("%d", &price); for(i = 0; coin[i]; i ++) { printf("%d円玉が%d枚\n", coin[i], price / coin[i]); price %= coin[i]; } }
ちょっと自分でやってみます 迷惑かけてすいませんでした
自己解決しました
エロイ人教えてください! エクセルで作成したファイルをスターファックスで VBAなどで自動送信出来ませんか? キーボードマクロなるフリーソフトを見つけましたが 自分ではうまく設定できません イメージは以下の感じです @送信ファイルをエクセルで作成 AVBAでスターファックスを起動 Bキーボードマクロ等で送信先を自動入力 Cエクセル画面に戻る 初心者丸出しですいませんが宜しくお願いします
どうでもいいが、とってもありがちな課題だな。
>>580 こんなソフト作ってくださいスレに行きやがれですぅ
583 :
580 :2008/05/11(日) 18:05:44
>>582 そんなスレあるんですか?
移動します スンマセン
ある下記のような2つのcsvファイルの「商品コード」という項目を比較して 実績ファイルにある「商品コード」が、商品コードマスタに存在するかどうか をチェックし、あったらその後の処理へ、なかったらエラーを出すといったプログラムを作りたいと考えてます。 (売上ファイル.csv) 顧客コード,商品コード,数量 10000,2544,2 12111,2566,5 12546,2354,8 (商品コードマスタ.csv) 商品コード,商品名,単価 2544,aaaaa,1000 2354,bbbbb,1500 このとき、c言語ではどういった関数を使って どういった流れで考えるとよいでしょうか? 例えば下名はアクセスを使ったことあるので アクセス(VB)でのテーブル同士の比較だったら、 if 商品コード(売上ファイルTBL)=商品コード (商品コードマスタTBL) をレコードのEOFまで繰り返す、という処理でいいと思うのですが、 c言語の場合、しかもカンマ区切りcsvファイルの処理の場合、 どういった方向で考えたらいいのかということを知りたいです。 参考書を見たところ、ファイルポインタをつかう、fopen関数をつかうfgets関数で1行読み込む といった機能を使うのかなと思いましたが、商品コード部分のみを取り出して比較するやりかたがわかりません。 (また、全てのデータの桁数は変わる可能性があります) あつかましいですが、よろしければサンプルコードも提示して いただけたらありがたいです。
585 :
側近中の側近 ◆0351148456 :2008/05/11(日) 18:28:17
>>584 (っ´▽`)っ
char shohinCode[256];
char shohinName[256];
int tanka;
fscanf(fp, "%s,%s,%s", shohinCode, shohinName, &tanka);
586 :
側近中の側近 ◆0351148456 :2008/05/11(日) 19:25:26
>>584 (っ´▽`)っ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *elem1, const void *elem2);
int existInMaster(void);
typedef struct shohinM{
char shohinCode[256];
char shohinName[256];
int tanka;
} shohinMaster;
int main(void)
{
int line;
line = existInMaster();
if(line == 0){
printf("エラーはありません\n");
}
else{
printf("%d行目にエラーがあります\n", line);
}
return 0;
}
(続く)
587 :
側近中の側近 ◆0351148456 :2008/05/11(日) 19:26:07
>>586 の続き
int existInMaster(void)
{
int returnCode = -1;
FILE *fp = NULL;
char line[1024];
int lineCount = 0;
shohinMaster *sm = NULL;
char shohinCode[256];
char kokyakuCode[256];
int suryo;
int count = 0;
int i;
fp = fopen("./商品コードマスタ.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1));
sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka));
count++;
}
fclose(fp);
qsort(sm, count, sizeof(sm[0]), cmp);
(続く)
588 :
側近中の側近 ◆0351148456 :2008/05/11(日) 19:26:48
>>587 の続き
fp = fopen("./売上ファイル.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
lineCount++;
sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo);
for(i = 0; i < count; i++){
if(strcmp(sm[i].shohinCode, shohinCode) == 0){
break;
}
if(strcmp(sm[i].shohinCode, shohinCode) > 0){
returnCode = lineCount;
goto END;
}
}
if(i == count){
returnCode = lineCount;
goto END;
}
}
END:
return returnCode;
}
int cmp(const void *elem1, const void *elem2){
return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode);
}
589 :
側近中の側近 ◆0351148456 :2008/05/11(日) 19:35:31
(っ´▽`)っ さあ感謝しなさい☆ (っ´▽`)っの足を舐めなさい☆
変なコテだけど、いいやつだな。
無意味にコテつけてる時点で・・・
592 :
側近中の側近 ◆0351148456 :2008/05/11(日) 20:46:21
(っ´▽`)っ
>>586-589 には
リソース解放漏れがたくさんあるから注意してね☆
関数existInMasterのEND:の直後に
fclose(fp);
if(sm != NULL){
free(sm);
}
を加えるんだ☆
593 :
側近中の側近 ◆0351148456 :2008/05/11(日) 20:48:10
594 :
584 :2008/05/11(日) 21:03:04
ご親切にありがとうございます。 ちなみにこのままコピペしてとりあえず実行してみようと思ったら 100個を超えるエラーが出たのですが、そのままではいけないのですかね? とりあえず、解読動くかどうかより 解読して、流れを理解することをがんばります
595 :
側近中の側近 ◆0351148456 :2008/05/11(日) 21:05:25
>>594 (っ´▽`)っ
インデントに全角スペース使ってるからね。
半角スペース、タブ文字は、2chでは表示されないの。
コピーしたら全角スペースを全て半角スペースに置換してね。
596 :
584 :2008/05/11(日) 21:13:39
>>595 了解しました。
なにからなにまでありがとうございます。
597 :
584 :2008/05/11(日) 21:24:18
>>595 すみません、もうひとつ。
今解読中なのですが、理解の手助けに
・処理の流れ
・このプログラムの入力と、出力値
など、簡単に教えていただけませんか?
本当の初心者ですみません。
HTMLの使用も理解できない馬鹿がいる。
>>598 それを言うならHTMLの仕様だろ、と。
まぁ、変数宣言の変数名を揃えようとする辺りでお察しだから。
灯台や鏡台の先生からは sed の使い方とかは習わなかったんでしょうかね?
>>597 自分がどういうプログラム要求したか覚えてる・・?
見ていくと何となく流れがつかめるでしょ
どこまで理解したか言わないと答え丸写しで理解した気になる子になるよ
初心者≠免罪符
602 :
側近中の側近 ◆0351148456 :2008/05/11(日) 22:39:49
(っ´▽`)っ /* *戻り値: *エラーなし:0 *エラーあり:エラーがある行番号(見出し行を除く) */ int existInMaster(void) { int returnCode = -1; /*戻り値*/ FILE *fp = NULL; /*ファイルポインタ*/ char line[1024]; /*ファイル読み込みバッファ*/ int lineCount = 0; /*行番号*/ shohinMaster *sm = NULL; /*商品マスタ配列*/ /*以下、売上ファイルレコード格納用変数*/ char shohinCode[256]; /*商品コード*/ char kokyakuCode[256]; /*顧客コード*/ int suryo; /*数量*/ int count = 0; /*商品マスタ配列サイズ*/ int i; /*ループカウンタ*/ /*商品コードマスタを全て読み込み、商品マスタ配列に格納する*/ fp = fopen("./商品コードマスタ.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1)); sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka)); count++; } fclose(fp);
603 :
側近中の側近 ◆0351148456 :2008/05/11(日) 22:40:30
/*商品マスタ配列を商品コードの昇順に並べる*/ qsort(sm, count, sizeof(sm[0]), cmp); /*売上ファイルを1行ずつ読み込み、商品コードを商品マスタ配列と照合する*/ fp = fopen("./売上ファイル.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ lineCount++; sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo); for(i = 0; i < count; i++){ if(strcmp(sm[i].shohinCode, shohinCode) == 0){ break; } /*商品マスタ配列は商品コードの昇順に並べている*/ if(strcmp(sm[i].shohinCode, shohinCode) > 0){ returnCode = lineCount; goto END; } } /*商品マスタ配列にない場合、行番号を返す*/ if(i == count){ returnCode = lineCount; goto END; } } END: return returnCode; } /*商品マスタ配列を並べる時、商品コードの昇順に並ぶようにする*/ int cmp(const void *elem1, const void *elem2){ return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode); }
604 :
側近中の側近 ◆0351148456 :2008/05/11(日) 22:44:43
605 :
側近中の側近 ◆0351148456 :2008/05/11(日) 22:52:56
(っ´▽`)っ 売上ファイルも商品コードの昇順に並べると もっといい感じになるかもね。
次の様に、単語毎に空白で区切られた文字列があり、一単語ずつ取ってくる処理を 行いたいと考えてます。文字列の中に入っている単語数は不定とします。 char str_str[] = "str1 str2 ・・・・ strN"; 今現在、次に書き込むソースの様な処理で、一つずつ単語を読み込んでいます。 ここで、質問なのですが、sscanf等を使用してもっと上手に処理することはできないでしょうか? 以下の様にダミー変数を利用する方法は考えたのですが、入っている単語数が不定 なため、どうも不恰好なソースになってしまいます。 sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy); すいませんが、アドバイスよろしくお願いします。
607 :
606 :2008/05/11(日) 23:33:02
現在使っているソースコードは以下になります。 int main(void) { char src_str[]="str1 str2 str3 str4 str5"; char *next; char *buff=src_str; while((next=strsplit(buff, " "))!=NULL){ // 空白文字が2個以上続いた場合はbuffにはナル文字が入っている if(buff[0] != '\0') fprintf(stderr, "buff=%s, next=%s\n",buff, next); buff=next; } return 0; } // 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す char *strsplit(char* str,const char* delim_str) { char* delim_point = strstr(str,delim_str); const size_t delim_len = strlen(delim_str); size_t i; if(delim_point == NULL) return NULL; else { *delim_point = '\0'; for(i=0;i<delim_len;i++) delim_point++; } return delim_point; }
608 :
606 :2008/05/11(日) 23:35:17
すいません、書き込んだ後、インデントがされてないのに気がついつきました。同じソースですが int main(void) { char src_str[]="str1 str2 str3 str4 str5"; char *next; char *buff=src_str; while((next=strsplit(buff, " "))!=NULL){ // 空白文字が2個以上続いた場合はbuffにはナル文字が入っている if(buff[0] != '\0') fprintf(stderr, "buff=%s, next=%s\n",buff, next); buff=next; } return 0; } // 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す char *strsplit(char* str,const char* delim_str) { char* delim_point = strstr(str,delim_str); const size_t delim_len = strlen(delim_str); size_t i; if(delim_point == NULL) return NULL; else { *delim_point = '\0'; for(i=0;i<delim_len;i++) delim_point++; } return delim_point; }
なんというstrtok
>>608 sscanf(str, "%s%n", ...)
611 :
606 :2008/05/11(日) 23:40:42
実際に処理をしている部分は冗長になってしまうため、以下のコードが 入っている部分で、処理を実施していると考えてください。 fprintf(stderr, "buff=%s, next=%s\n",buff, next); また、src_strの内容が変わってしまう点は仕様として、その様にしてます。 よろしくお願いします。
612 :
606 :2008/05/11(日) 23:59:40
>609 確かに、この処理内容だと、strtokで十分ですね・・・。文字列群で区切るstrでは 不便な事が多く、strsplitという文字列パターンで区切る関数を作成しており、何も考えず そのまま使用していました。ご指摘ありがとうございます。 >610 すいません、その処理はダミー変数を利用する方法とは異なる方法なのでしょうか? つまり、下記の様な処理とは別の処理ということなのでしょうか? sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);
rand関数は合同乗算法ですか?
仕様上特に決まってない。 最近は lagged Fibonacci なこともあるようだ。
>>613 どういう方法でなければならないという規定はない。
現実には線形合同法がよく使われている。
>>614-615 レスありがとうございます。
c言語で書くと
a[i+1]=a[i]*j%10*10*10*10
で良いのですか?(a[i+1]=j*a[i] (mod10^4))
数学板から飛んできたか a[i+1]=a[i]*j%(10*10*10*10) というか a[i+1]=a[i]*j%10000 でいいんじゃないのか
すみません質問を変えます。
0から1の範囲の乱数を合同乗算法で書くにはどのように書けばいいですか?
>>618 ばれたか・・・正直kingはウザイと思っています。
数学板でも思ったんだが、前の質問に答えてもらってるのに、 それに何の反応もせずに「質問を変えます」はないだろ。社会常識的な意味で。
整数の 0〜(n-1) の乱数を発生させて double にキャストして n で割ればいいんじゃない
>>622 レスありがとうございます
a=rand()/(RAND_MAX+1.0);
としてもいいのですが
>>618 さんの方法で書くことはできませんか?
a[i+1]=a[i]*j%10000; b[i+1]=a[i+1]/(10000.0);
>>624 ありがとうございます
一応書いてみたのですがエラーが出てしまいます
どこがおかしいですか?ちなみに円周率を求めるプログラムです
#include <stdio.h>
int main(void)
{
double i,max;
double x,y,pi;
int a[1000],j;
double b;
double c=0,d=0;
max=100;
a[0]=9454;
j=9456;
for(i=0;i<=max;i++) {
a[i+1]=a[i]*j%10000;/*ここでエラーが出ます。*/
b[i+1]=a[i+1]/(10000.0);
if((b[i+1]*b[i+1]+b[i]*b[i])<=1.0) {
c+=1.0;
}
else{
d+=1;
}
}
pi=4*c/(c+d);
printf("%f\n",pi);
return 0;
}
数字を渡したら曜日を表示する関数を作ったのですが、関数内に char youbi[7][] = {"日曜日", "月曜日",....} と書きました。 これだと関数が呼ばれるたびに変数を作って文字列を入れてることになりますよね? 頻繁に呼ぶ関数にこういうことすると速度などに悪い影響ありますか?
double i
628 :
626 :2008/05/12(月) 01:37:21
すみません訂正します。 char youbi[][7] です。
>625 iをintで宣言すること。 >626 ある場合もあるし、無い場合もあるが、大抵の場合気にするほどの差ではない。
&はアンパサンドだけど |はなんていうんだっけ? なかなか検索ひっかからないんだよね
>>627 そうですね・・・すみません
でも、 配列または、ポインタでない変数に添字が使われました。とエラーがでます・・・
どこを直せばよいですか?
パイプ
633 :
626 :2008/05/12(月) 01:41:06
>>629 ありがとうございます
気にしないことにします
>>631 そこまでエラーメッセージ読んでてわからないほうがどうかしてる
>>631 それくらいコンパイラが懇切丁寧に教えてくれてるだろうに無視すんなよ
頼むからエラーをこぴぺしてくれ
>631 配列でもポインタでもないものに添え字が使われたから。あとは行番号を見ること。 念のために言っておくが添え字とは[?]の部分のこと。
>631 double b;
せめてエラーメッセージの意味を考えることくらいはしてほしいよまったく ただのcharの配列にしか過ぎないのかっての
>>634 あ、bを配列で宣言するのを忘れてました・・・
ありがとうございます
やっぱりプログラムは苦手だなあ
数学板の回答者に戻ります
オーバーフロー・・・
数学板ってあんなんでも回答側になれんの?
わざわざ自称している時点で…
↓聖徳太子知ってる?知らない?
乗算合同法や線形合同法の利点ってメモリ使わないことなのに、 配列に保存してどうすんだよw
645 :
↑ :2008/05/12(月) 06:56:00
>>626 staticを付けるといい。
ついでにconstも付けるとさらにいい。
>>612 %nの仕様は調べた?
>>626 static const char * const youbi[] = {"sunday", "monday", ...}
リテラル参照はこっちのほうがいいかも? char *youbi[7] = {"日曜日", "月曜日",....} 好みの問題ですかねぇ・・・
>>648 それだと毎回youbiを更新するコストが発生するし、constによる保護ができない。
ついでに言えば、態々7という定数を埋め込む意義が全くない。
確かにスタックに積む場合にはその分の手間がかかるけど、staticのほうがデータ参照は遅くなるんじゃないかったっけ?
const だけつけとけばコンパイラが何とかしてくれそうな気がするんですがどうなんですか?
抽象的な質問しないで、具体的に質問してくれ。 つーか、入門者がパフォーマンスを気にするな。
曜日文字列を使うような関数が、パフォーマンス気にするほど頻繁に呼ばれてるとは思えないねぇ そうだとしても実測してみなきゃわかんないしね
>>653 もし頻繁に呼んでるとしたら、いっそ廃止して
その上の(おそらくループの本体がある)関数で文字列をautoに積んで
インラインで処理させたほうが速いだろうね
>>629 で終わった話をいつまでグダグダやってるんだ
656 :
デフォルトの名無しさん :2008/05/12(月) 13:22:59
TEST.Cをコマンドプロンプトで指名してコンパイルする時、拡張子が.Cだとコンパイルできなくて.cだとコンパイルできたんだけど、.Cと.cって違うの?
>>656 少なくともそのコンパイラにとっては違うからコンパイルできなかったのだろう。
ファイル名の指定を間違ってたんじゃないの ファイル名の大文字小文字を区別する環境としない環境があるから、それも書いてくれ
Sun辺りは.CはC++の拡張子だった希ガス。
上の static const char * const youbi[] って何でconst2つも付けるのかが分からないんですが static const char * youbi[] じゃあダメなんですか? あと、普通の変数でも static const int const とかやる必要はあるんですか?
static const char *youbi[] youbiの先の文字列が書き換え不可能 static char * const youbi[] youbiが書き換え不可能 static const char * const youbi[] 両方
static const char *youbi[] は "火曜日" って文字列を "火曜"
途中で書いてしまった static const char *youbi[] は "火曜日" って文字列を "火曜" に変えたりするのが不可能で static char * const youbi[] は youbi[1] に別の文字列のポインタを渡すのが不可能になる って事なんですか?
const char *youbi[] は const char 型のポインタ(文字列定数)を入れる youbi配列で、新たに文字列定数のポインタを入れることは出来て、 char * const youbi[] は youbiの中のポインタ変数固定だから、文字列そのものは書き変えられてもポインタの指す先は変えられないって事なんですね やっと理解出来ました ありがとうございます
665 :
デフォルトの名無しさん :2008/05/12(月) 16:40:42
#include<stdio.h> double f(double x) { double y; y=(((3.1*x-1.8)*x+5.7)*x+1.0)*x-6.2; return (y); } main() { double x,y; int i; for(i=-20;i<=20;i++){ x=0.5*i; y=f(x); printf("x=%7.3f y=%12.3f\n",x,y); } } このプログラムのyの値の総和を計算するプログラムを作れ。 これをだれかお願いします。
667 :
デフォルトの名無しさん :2008/05/12(月) 16:46:32
>>657 なるほど〜 コンパイラの仕様か〜
>>658 指定の仕方は大丈夫なはず コンパイラはMinGW これでいいのかな?
>>659 Sunってコンパイラ名・・? コンパイラによって違うってこと?
宿題丸投げは宿題スレへ
>>667 >
>>659 Sunってコンパイラ名・・? コンパイラによって違うってこと?
Javaを開発し、OpenOfficeを提供している世界最大級のコンピュータソフト・ハード兼業企業。
古くから、SunOSというUnix系のOSを作っている。
670 :
デフォルトの名無しさん :2008/05/12(月) 17:55:41
あ〜 なるほど OSによって違うってことか〜 勉強になりました
671 :
デフォルトの名無しさん :2008/05/12(月) 19:47:16
配列に配列を足すことってできないの? a += b; みたいな
Linux上では問題なく動作したのですが、 windows(BCC Developer)だと、ファイルをオープンする事ができなくなりました ファイルパスを絶対パスにしたりと、試行錯誤しましたが解決しません どうか、解決法をお願いします ソース void read_area(struct prefecture *are) { int i; FILE *fpa; if(( fpa = fopen("menseki.txt" , "rw")) == NULL) { printf("ファイルが見つかりませんでした\n"); exit(1); } for(i=0;i<47;i++) { fscanf(fpa,"%s %d",are->name,&are->area); are++; } } txtファイルは、Debugフォルダとその上のファルダに置いています
>>672 ソースファイルと同じ場所に置けばいけるはずだけど
exeと同じ場所
>>673 日本語読めますか?
>>672 それが原因かどうかは判らんが、"rw"は間違い。
実装によってはファイルが空になってもおかしくない。
>>671 できません。配列の要素ごとの足し算ならループから書くことになります。
配列の連結と言うことなら、malloc(), realloc()を使うことになるのでその辺りを先ず勉強する必要あり。
>>671 それだけの日本語ではさっぱりですよ。
たぶんこういうこと?
for ( int i = 0; i < SIZE; i++ ) {
a[ i ] += b[ i ];
}
>>673-674 ファイルの置き場所に問題があるのかと思い、ソースがある場所を含め、
プログラムに関係ありそうなフォルダ全てに置いたのですが、解決しませんでした…
これは、BCCの環境設定?を変更・追加する必要があるのでしょうか?
>>675 Linuxで動いたのは運が良かったからかもしれません…
指摘していただいた点について、もう一度解決法を探してみます
678 :
677 :2008/05/12(月) 20:16:39
"rw"を"r"にした所、正常に動作しました!
よく考えてみれば、書き込みする必要がないので、"w"は不要ですね…
>>673-675 つまらない質問にも関わらず、素早い対応して頂き、
本当にありがとうございます
679 :
デフォルトの名無しさん :2008/05/12(月) 20:27:05
>>676 そうだけど
構造体のときは不便だなって思った
そう思ったんならC++へ旅立ってしまえ
>>679 そんなのラッパー関数かいときゃ次からは楽じゃないか。
683 :
デフォルトの名無しさん :2008/05/12(月) 22:34:04
C言語勉強したいのですがフリーソフトはないんでしょうか?
686 :
デフォルトの名無しさん :2008/05/12(月) 22:52:43
>>686 visualC++だ
そしてとっととうせろ
>>686 登録とかめんどくさいからBCC使うといいよ
俺はvisual C++使ってるけど
BCC もメルアド登録必要じゃね?
デバッガは登録必要だったような気がするけど コンパイラは要らなかったような…
あれ? メルアド変わるまでスパムのように来てたんだが。
VC++も登録いらんだろ isoを落とせば
それめんどい
695 :
デフォルトの名無しさん :2008/05/13(火) 08:04:28
C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど 単純にC言語のプログラムを作りたい時はどうしたらいいんですか?
>>695 誤 C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど
正 VisualC++でC++プログラム作ろうと思ったらVBの作成画面みたいなんですけど
Win32コンソールアプリケーションを選べ
実行時に与えられる条件により異なる値で初期化して、 以後はconstに扱われるような変数を宣言することはできますか?
700 :
699 :2008/05/13(火) 13:59:49
追記 環境変数のような働きをするグローバル変数です
>>699 実装によっては可能かもしれないが、直接に行うことは一般的にはできない。
constな変数はそれが作成されたときに(関数の外で宣言される変数ならプログラムの開始時、あらゆる関数の外で)初期化されて
以後のコード中では変更できなくなるため、実質的にコンパイル時に解決可能な式でしか初期化できない。
ポインタを間にはさめば、以下のような方法で似たようなものを間接的に宣言することができる。
value.c)
static int value;
const int * const vp=&value;
value.h)
extern const int * const vp;
#define VALUE (*vp)
このようにしておけば、グローバル変数(のふりをしているマクロ)VALUEの実体であるvalueは、少なくともvalue.c以外で変更されることはない。
あとは、取得用の関数を公開する形にして 当該の変数をstaticにしてほかのファイルからは見えないようにするとか、 const変数を動的初期化できるC++へ移ってしまうとかが考え付く。
int GetValue() { static int value=-1; if(value < 0){ /* 最初に呼び出されたときに初期化される */ : : } return value; } #define VALUE GetValue() な手か
失礼します。 void hoge(double** matrix) {} 等として受け取ったdouble**の配列の要素数をその関数内で知るすべがあったらご教授願います。
ありません
配列matrixの終端要素になにか特別な値が格納されていれば それを検出することで長さを知ることができる そうでなければ無理
char name[100]; name="hoge.txt"; みたいに代入したいんですが、エラーになります。 *name="hoge.txt"; でもできません。どうやるんでしたっけ?
何で駄目なのかはわかる? strcpy(name, "hoge.txt") とか? strncpy(name, sizeof(name) - 1, "hoge.txt")か
>>708 すいません。わからないので教えていただけるとありがたいです
>>709 Cでは配列は二級オブジェクト(メモリ上に存在するが演算の対象にならない)で、
配列名は大抵の場合配列そのものではなく配列の先頭要素のアドレスを意味する。
アドレスに代入することはできないので、name="hoge.txt"; のような文は無効になる。
配列名に対して直接=演算子が使えるのは、宣言時に初期化するときだけである。
配列に対して任意の配列をコピーするにはmemcpyやmemmove、
あるいは配列が'\0'で終わるcharの配列(文字列)である場合にはstr〜系の関数を使う。
1) strcpy(name, "hoge.txt"); 2) strncpy(name, sizeof(name)-1, "hoge.txt"); name[sizeof(name)-1]='\0'; 3) name[0]='\0'; strncat(name, sizeof(name)-1, "hoge.txt"); 1)はもっとも単純明快だが、もしnameに割り当てられている領域が コピーしようとしている文字列より小さかったらたぶん問題がおきる そのような場合に文字列を切り詰めて安全を保証したいなら2)または3)を使う
わかりました!どもうありがとうございました
>>711 横見だが 2 および 3 の引数の並びちがうぢゃろ。
strncpy(name, "hoge.txt", sizeof(name) - 1);
name[sizeof(name) - 1] = 0;
文字列リテラルをコピーするのにstrn*()を使うのか……
当然だろ
sprintfでおk
だからオーバーフローが・・・
オーバーランじゃねーの? それともオーバーフローでもおkなの?
おk
>>717 桁数勘定して sprintf(b, "%100s", s); って, 書けば OK なんじゃないの?
自分の言語/文法理解が間違ってるのかも、と思って駆け込んできた --- #include<stdio.h> int ary_[]={1,2,4,8}; int main(int argc,char** argv){ int* ary=ary_; int i=(*ary++) ^ (*ary++); printf("%d\n",i); return 0; } --- これの実行結果がゼロになるのはなんでだぜ? VC9EE v15.00.21022.08 最適化無指定、/O1 で発現 VC9SP1βはまだ試してない
>>723 未定義動作だからどうなっても文句は言えない
むしろどうなると思ったんだよ・・・
副作用完了点
>>721 いや、そういう意味じゃなくて・・・それらの問題点は
プログラムそのものがトラブルを起こしてしまう仕組みを持っていることであって
問題の無い範囲内でユーザが使う分にはなんら不具合には気づかない、起こらないわけで・・・
>>724 え。一発目の*ary++が1に、二発目の**ary++が2に、…
…いや、最適化で順序がどうなっても、i==3にはなると思ったんだ
/Fa によると、どちらも*aryになり、そのあとで2回ary++が発生してた
どこで未定義なんだろう…。
// ここでリロード
>>725 ヒントありがとう ぐぐったら一発 必ずしも都度都度副作用が発生するわけじゃないのか
アマだが、聞かねば一生のバグ撒き散らしになるところだったよ 恥晒してよかった
ary = ary++;
730 :
723 :2008/05/14(水) 00:28:52
>>729 これを考えてみろ。ってことだろう
実際にVC9EEにつっこんで結果を見てみた
ary = ary;
ary++;
になった 俺には示唆に富んでると思う
>>723 未定義だけど、1^1で0になってる気がする
直前の副作用完了点と次の副作用完了点までの間に、 式の評価によってオブジェクトに格納された値を変更する回数は 高々一度だけでなければならない。更に、変更前の値は、 格納される値を決定するためだけにアクセスしなければならない。
初心者なんですが、お願いします 文字列を式として扱って計算結果を出力する というような便利な関数ってあるのでしょうか?
標準ではありません。頑張って作ってください。 まぁ、unix系ならシェルで計算すれば済むけどね。
Java、JavaScriptだと eval というものがあるんだが、自分で実装するっきゃないね。
簡単な計算させる程度なら、bison/flexあたりでどうにか。 変数が入るようなやつなら、いろいろあるけど、いっぺんPerlとか使うといいと思うよ Perlで書く。のではなくて、perl*.dllをつつくように書く あれはインタフェースがCだから。 セキュリティの確保とか結局いろいろ大変になるだろうけど、示唆に富んでていいと思う
学校の課題で 「関数の中で宣言した値は、関数の実行が終わった後どうなるのか?たとえば二度目に関数を呼んだとき値を読んでみたら どうなるのか?」 って問題が出たんだけど答えどころか質問の意味すらわかりません。よかったら教えてください。
ローカル(自動)変数とか、静的(スタティック)変数とかを教える意図の質問じゃないのかな?
>>740 void hoge(void)
{
int a; ← A
a = 2;
a = a * 2;
} ←@
void main (void)
{
hoge();
hoge();
}
@関数終わったらaはどうなる?
A2回目のhoge呼び出しの時、このaに4が入っていると思うか?
ローカル変数には初期値入れることになるんだし なんだかなぁって思う問題
>>741-743 こんな早く答え返ってくるとは思ってませんでした。
有難う、みんな優しいですね。
>>742 @無くなる?
A…4じゃないんですか?
aに何も入れない状態で出力させるのさ。 できれば、hoge()を呼び出す階層を変えて試すのもやってみて (別の関数を呼び出しその中からhoge()を呼ぶ)
成程!試してみますね。 ご丁寧に有難うございました。
試してみる、はよくない たまたま4が入ってたらどうするんだ
高確率で入ってるだろ。 だから深さも変えるといいかな、と。 アドレス表示させる手もあるが。 最適化されてると混乱しそう。
ちゃんとCの仕様を示して理解させるのが正しい姿勢 とりあえず試してうまくいったから、なんてのを放置すると そのうち必ずなにかやらかす
>>744 @無くなる
A何が入っているかわからない
>>740 関数の中でstaticをつけずに宣言した変数は、その関数の呼び出し中にのみ存在する変数(auto変数)となる。
宣言した関数から抜けた時点で、変数のために使われていた記憶領域は解放されて意味のないものになる。
このような変数は、明示的に int a=2; などのように初期化しないかぎり、
その宣言時における値は常に不定(何が入っているかわからない)である。
このような変数の中身を、明示的に値を与える前に使ってはいけない。
学校の課題なんだから、そんなのは教わるんだろう。 今知りたいのはこの質問の意図するところだべ。
仕様を理解してりゃ意図はわかるだろ 意図がわかんないってのは理解してないからだ
>>740 なお、staticをつけて宣言した変数は、プログラムが実行を開始してから終了するまで存在し、
その開始時に一度だけ、明示的な初期化式があればその値に、なければ「=0;」とか「={0};」と
書いたかのように初期化される。
755 :
740 :2008/05/14(水) 23:45:33
>>753 その通りです。
まだ講義で習ってない範囲(質問する前は習ってない範囲
かすらもわかりませんでした)で何も知りませんでした。
今回皆さんに教えて頂いたお陰でまだ何となくですが、
わかるようになりました。
あとは講義で理解していこうと思います。
補足してくださった方々もわかりやすい説明有難うございました!
ここ勉強になりますね。
>755 忠告だが その講義の教官の言うことは眉唾して聞いたほうがいい 教えてないことを聞くとかありえねー
課題自体はすげー授業のそのまんま復習くせーし 話聞いてなかったんだろどうせ
>>757 両方の言い分を聞かないと分からないぞ
ここで教官の言い分を聞く事はまずないだろうけど
課題なら別に教えてないことが出てきてもいいと思うけどな 小学校じゃあるまいし
横槍だが 眉唾する という使い方がないんです、辞書を引いても分かるように。
下記の場合volatileがあるためValueを外部から書き換えるまでループを続けると思うのですが、 volatile ULONG Value; // レジスタ(外部から書き換えられる) void main(void) { Value = 0; while(Value == 0){ ←これ ; } } これを下記のようにポインタを経由すると最適化対象になってしまうのでしょうか? (このポインタもvolatileをつける必要がある?) volatile ULONG Value; // レジスタ(外部から書き換えられる) void main(void) { Value = 0; ULONG* pV = &Value; while(*pV == 0){ ←これ ; } }
>>767 volatile 修飾する必要があります
>>767 volatileをつけなければ最適化対象になります。
が、最適化対象になるとValueを外部から書き換えるまでループを続けるという動作を必ずしなくなるわけではありません。
つまり、volatileをつけなくてもあなたの希望する動作をする可能性はあります。
つまり、volatileをつける必要があるとは言い切れません。
>つまり、volatileをつけなくてもあなたの希望する動作をする可能性はあります。 それは普通、つける必要があると言いますね。
↓必要条件とか十分条件とか言い出すヤツ
|↑ ++ ビルド毎に出力を確認すればおk てか、Cの話でなくなるが、テストで引っ掛けろ
773 :
デフォルトの名無しさん :2008/05/15(木) 22:38:30
プログラム知識0の俺がCを勉強しようと思うんだが 解説サイトと本どっちがいいの? 色々な掲示板みてたら両方とも良いって書いてたからわからなかった。
じゃあ、とりあえずお金のかからない方法でやってみて それで不満に感じたら本を買えば良いんじゃないかな
775 :
デフォルトの名無しさん :2008/05/15(木) 22:49:12
レスありがとう その方法が一番いいかな〜 とりあえずググってサイトさがしてみる。 サイトって「C言語 入門」でググって上らへんのなら大丈夫だよね?
本はだめな本があるから、本の紹介サイトを見たほうがいいぞ。
777 :
デフォルトの名無しさん :2008/05/15(木) 23:39:22
そうなんだ まだ買わなくてよかった〜 ありがとう それみて本選ぶよ
本もそうだがサイトは特に多くのところを回った方がいい。 嘘を書いている、情報が古すぎる、環境依存なコード、誉められないコーディングスタイルetc... あと、サイトにすることで有利な点は、疑問点があればここにアドレス張り付ければ一応質問できることかな? 書籍だと同じ本持ってる人間以外には内容をいちいち書いてもらわないと質問できないから。
何を学ぶか?で選ぶ資料も違ってくる。 ソートに関しては、すでにどの手法が高速か分かりきっているが 教本によって記述が違っているものも。中には、あれ?って思うものも。
っつか、コードが悪い
宿題スレはとりあえず提出できればいいやーって人向けで、
自分で理解するには向いてないと思う
つか
>>780 のソースは宿題スレではかなり親切な方だと思うけどな
一応コメントついてるし
数当てだからといって、4桁の整数にこだわらずに 数字の文字4個の配列を使ってる。そこだろう 数字 + '0' <-> 数字の文字 理解するところまで宿題なんなら、ヒントだと思って考えてみるよろし
>>780 何がわからないのか具体的に説明してくれないと解説のしようもない。
785 :
デフォルトの名無しさん :2008/05/16(金) 14:41:36
すみません。いきなりですが、本当に初心者なので分かりません。C言語では基本的に全て数値としてデータを格納すると聞きました。 ただ逆に数値(1〜9)を””で囲んで文字列とする場合、内部データは本来の数字にNullが付いた物でなく、ASCUコードで あれば文字の1なら10進数の49(16進数の10X3)に変換されるという認識でよいのでしょうか? 又、普通の文字ならは該当する10進数・16進数に変更はなくNuLLが付くだけなのでしょうか?数値ま場合だけデータそのものが 例えば1なら実質先程言った49に変換されるという認識でよろしいのでしょうか?どうかご教授願います。
16進ダンプとかって最近は見る機会無いのかな
787 :
デフォルトの名無しさん :2008/05/16(金) 14:48:13
>>786 Windowsでは見る機会がないでしょうねぇ〜〜〜禿藁
だからLinuxを使えとあれほどry
>>785 C言語では(エスケープシーケンスを除き) ど ん な 文 字 も そのマシン上での文字集合に対応するデジタルな値として扱われる。
ASCII文字集合を使用しているすべてのマシンで、"1"は0x31 0x00で、" "は0x20 0x00である。
数字であろうと何であろうと扱いに差はない。
linuxだと強制的に見なきゃいけない機会でもあんの?
790 :
デフォルトの名無しさん :2008/05/16(金) 15:11:01
ありがとうございました。Cはそなのですね。
ntsd使うなり、IDEの16進メモリ表示モード使うなり さすがにgdbに張り合ううつもりはないが、ntsdは結構遊べる
なお、Cの話をする際において安易にNULLという単語を使うべきではない。 CにおいてNULLと書いた場合通常はヌルポインタ定数を表すマクロNULLのことをさす。 ASCIIのNULのことを言う場合にはNULまたはヌル文字と表記するべきである。 ついでに、ASCIIは A.S.C.I.I.(American Standard Code for Information Interchange) であってASCUではない。
>>789 mpeg とかかまってると, Windows でも強制的に見なきゃいけない機会は結構あるが…
俺がNULって書いたらナルだろーが! とおっしゃりたいのですか? どっちでもいいじゃん
呼び方なんてどうでもいいよ 区別がついてないのはお前の方じゃねーかって話
何を指摘したいのかを明確に挙げずに文句つけても話が混乱するだけだぞ 煽りたいだけならよそでやれ
>ASCIIのNUL ……
なんかまた変な奴が沸いたな。 相手すんなよ、つけあがるから
800 :
デフォルトの名無しさん :2008/05/16(金) 15:47:50
Windows使ってるとNULLとNULの違いすら分からないようだな。 駄目だこりゃ。
なんだ またいつものアレか
803 :
デフォルトの名無しさん :2008/05/16(金) 16:06:33
804 :
雷 :2008/05/16(金) 16:28:57
microsoft visuar studioで *印を出力するプログラムを作成してください 整数型の変数nに7〜15の値を設定する 変数nの値により,以下のような表示を行う(n=7の場合) for文(またはwhile文)とif文の組合せである カウンタ変数が偶数か奇数かで判断 printf文は printf(“n=%d\n”,n); // nの値を出力 printf(“ “); // 空白を出力 printf(“*”); // *印を出力 printf(“\n”); // 改行する だけを使用する n=7 * * * * * * * * * * * * * * * * * * * * * * * * * 上の条件でこういう風に表示するプログラムを書いてください
宿題なら宿題スレへ
807 :
780 :2008/05/16(金) 18:32:38
float型やdouble型の内部構造がいまいちよく理解できないんだが、どっかわかりやすいとこない? 最上位ビットが符号で使われるのはわかるんだけど、それ以外がよくわからない。 小数点以下の数値をどうやって保持してるの?
>>809 ありがとう。指数表記を使ってるのがわかって疑問が解けました。
typedef struct{ double x, y; }vector_t; typedef struct{ vector_t vector; double length; }edge_t; edge_t *edge_alloc(char *filename, int *edge_num) { int i, point_num; vector_t *point; edge_t *edge_area, *edge; FILE *fp; 途中略 edge_area=malloc(sizeof(*edge)*(point_num+1)); edge=&edge_area[1]; edge[-1]=edge[point_num-1]; *edge_num=point_num; return edge; } このソースなんですが、edge[-1]とかいう場所に代入していいんですか?
edge[-1] == (&edge_area[1])[-1]
えっと〜 ?
edge[-1] == edge_area[0]
edge[n]と書くと、配列edgeのn番目、みたいに読める。
しかし、配列の中(最初かもしれないし、最後かもしれないし、途中かもしれない)を
指し示すポインタedgeの、そっからn番目、とも読める。
もちろん、edge[-1]の存在は、ちゃんと担保されてないといけないけど、
文法的にというか、読み方的には、そういう意味
てことで、
>>814
edge[-1] == *(egde - 1) なので文法的に問題は無い 大丈夫かどうかは指してる先がちゃんとあるのかの問題になる
値を代入してるわけではないんですか?
代入してる場所は代入しても問題ない場所。 上の数レス読んで理解できないならあきらめろ。
ああそうだ もしかしてと思ってエスパーしてみるが、 edge=&edge_area[1]; の部分で、配列のコピーが発生したりは、してないからね 強いて言うなら、位置情報を代入している。それも、「一個先の位置」ね。
820 :
デフォルトの名無しさん :2008/05/17(土) 13:18:52
4,5,6進数の九九を作ってください。 4進数なら 1 2 3 1 1 2 3 2 2 10 12 3 3 12 21 こんな感じです。お願いします。
822 :
デフォルトの名無しさん :2008/05/17(土) 13:20:36
4,5,6進数の九九を作ってください。 4進数なら 1 2 3 1 1 2 3 2 2 10 12 3 3 12 21 こんな感じです。お願いします。
823 :
デフォルトの名無しさん :2008/05/17(土) 13:22:05
なんか九九表がうまくできないですけど
1 2 3 1 1 2 3 2 2 10 12 3 3 12 21 こうしたいんだろ? それはともかくとっとと消えろよ
825 :
デフォルトの名無しさん :2008/05/17(土) 13:22:36
今日から、パッケージソフトを作るための勉強をします。 何の言語を勉強すれば、よろしいでしょうか? 個人的には、C++がいいかと。 求人案件などを見ると、求人が多いから。 (ちなみに、どんなソフトを作ろうとしているかというと。 動画編集ソフトを作ろうとしています。)
>>825 スレタイを百回音読して涙を流しながら去れ
827 :
デフォルトの名無しさん :2008/05/17(土) 13:25:41
Borland BCC32(フリー版)を使ってますが、リアルタイムキー入力を使いたいのですが その関数名を教えて下さい (BasicのINKEY$見たいな物)
>>829 どうも!、Dos用の関数でお願いします。
本当のDOS用なのか? あるいは、Win95以降のコマンドプロンプト用なのか?(たぶんこれ) まさかとは思うが、/subsystem:native用か? どれにしてもこのスレのレベルなのかって感じではあるが、 まずそこらはっきりさせようぜ
何時もUNIXなのでWinの事分かりませんので Winでもrxvt(WinのLinux console)に居ます GCCなら簡単なんですが、、Borland のlibrary読めば解るんだけど 今、手一杯で時間が無くちょっと聞いて見ようかと思って!
読めば分かるなら聞くなよ
これはひどい
>>830 bcc32はDOSアプリケーションを作れないので、意味ない。
DOS窓で動くプログラムもWin32アプリケーション。
>>832 それならCygwinでGCC使えば?
使い慣れたライブラリもきっとWindowsで使える。
簡単な質問だと思ったんだろう けどそれ、よくある簡単そうで簡単じゃない問題のような UNIXでいう/dev叩きに似たコーディングはWindowsにもあるけど、 GetAsyncKeyState()みたいなのをつつくほうが手堅いと思う
本当に DOS だっつーんなら kbhit で入力を検知してあれば getch でおkだな。
C言語のプログラムの書き方の質問ではないのですが 大学の講義で使っているbcc32というコンパイラーを、 自分の使っているノートPCにもインストールしたいのですが、 どこを探してもリンク切れになっています。 bcc32をインストールできるサイトを教えていただきたいのですが。 本当に初歩的な質問で申し訳ないです。
あれは"C++ Compiler 5.5"とかいう名前なので、それでぐぐれば一発だお
841 :
デフォルトの名無しさん :2008/05/17(土) 21:50:52
ターボエクスプローラー無料版にもBCC入っている 上位互換だよ 5.5よりバグが少ない。 C++の新機能に対応している。
Linuxで、端末の幅を習得したいんですが、 そういう関数とかシステムコールってありますか?
習得w ~/.bash_profileとか~/.bashrcにあるんじゃね? これらのファイルを読み込んでるから
844 :
デフォルトの名無しさん :2008/05/18(日) 00:10:38
配列を使わずに、下のようなひし形を作るブログラム作成中なのですが… ____* ___*** __***** _******* ********* _******* __***** ___*** ____* ※_は気にしないでください。ずれるのを防止のためにつけたので。 *は9個を基準にお願いします。 途中まで考えてみたものです。 #include <stdio.h> void main(void) /*ひし形*/ { int i,j; for (i=1;i<=9;i=i+2){ for(j=1;j<=i;j=j+1){ printf("*"); } printf("\n"); } } 上のだと、上半分はできてて左詰めになってるままです。
>>842 >Linuxで、端末の幅を習得したいんですが、
「端末の幅を習得」するような関数、システムコールなど、その他一切そのようなものは存在しません。
端末の幅を取得したいだけでしたらman termcapすれはヒントが得られるかもしれませんが、
犬板で聞くのが一番です。
>>842 ioctl を使うらしいとググル先生はおっしゃいました
続きはwebで!
>>844 >※_は気にしないでください。ずれるのを防止のためにつけたので。
同じことがあなたのソースにも言えます。
つまり、その「隙間」を気にしない(≒出力しない)ものだからずれてしまっているのです。
>上のだと、上半分はできてて左詰めになってるままです。
上半分ができているのなら、下半分も作りましょう。
>>846 >ioctl を使うらしいとググル先生はおっしゃいました
いいえ。
void main は gcc でエラーになると何度言えば
850 :
デフォルトの名無しさん :2008/05/18(日) 00:37:27
ハッシュ関数のチェイン法について質問です。
http://www.geocities.jp/ky_webid/algorithm/014.html このページを見ると、
bucket = hash( key );
p->key = key;
p->data = data;
p->next = table[bucket];
table[bucket] = p;
ここでデータを連結リストの末尾に追加する、と書いてあるのですが、
これだとリストの最初(ハッシュテーブル側)に挿入していることになりませんか?
そもそも末尾に追加するなら、p->next = NULLでなければおかしいと思います。
>>848 大丈夫か?
>>842 #include<stdio.h>
#include<sys/ioctl.h>
int main(void)
{
struct winsize wnd;
ioctl(0, TIOCGWINSZ, &wnd);
printf("Width:%d Height:%d\n", wnd.ws_col, wnd.ws_row);
return 0;
}
852 :
デフォルトの名無しさん :2008/05/18(日) 00:50:47
>>847 下半分を作るためにはソースのどこの部分に入れればよいのでしようか?
>>837 サンクス!
DOS用ってホントめずらしいよ、研究所に勤めているけど先輩方は7〜10日間に
一回位いしか来ないしさ、新人の俺に任してほったらかし、来てもコーヒー飲んで
帰えちゃうし、入所も退所時間もないから気楽だけど、今日も一人で徹夜だよ!
854 :
842 :2008/05/18(日) 00:56:52
>>843 , 845
ごめんなさい。間違えました。端末の幅を収得ですね。
>>846 , 851
みなさん。ありがとうございます。助かります!!
855 :
デフォルトの名無しさん :2008/05/18(日) 00:57:37
>>847 852訂正です。
下のソースで上と下の両方表示させることができました。
あとはずらしてひし形にする部分だけなのですが・・・
#include <stdio.h>
void main(void) /*ひし形*/
{
int i,j,a,b;
for (i=1;i<=9;i=i+2){
for(j=1;j<=i;j=j+1){
printf("*");
}
printf("\n");
}
for (a=1;a<=7;a=a+2){
for(b=7;b>=a;b=b-1){
printf("*");
}
printf("\n");
}
}
856 :
851 :2008/05/18(日) 01:00:32
857 :
854 :2008/05/18(日) 01:05:37
>>856 うぎゃーーー
今までずっと間違えて生きてきますた・・・
>>855 ずらすのにはスペースを用いて下さい。
ひし形の左側に必要なスペースの数を計算してfor文などを
用いて表示させて下さい。
>>844 #include <stdio.h>
void main(void) {/*ひし形*/
int i,j,max=9;
for (i=1; i<=max/2+1; i++){
for(j=0; j<=max/2-i; j++) putchar(' ');
for(j=0; j<i*2-1; j++) printf("*");
printf("\n");
}
for (i=max/2; i>=1; i--){
for(j=0; j<=max/2-i; j++) putchar(' ');
for(j=0; j<i*2-1; j++) printf("*");
printf("\n");
} }
>>850 そうですね。
末尾に追加するのは面倒(リストを最後まで辿らないといけない)なので、先頭に追加するのが普通です。
サイトの管理人さんに間違いを指摘しておくとよいです。
860 :
デフォルトの名無しさん :2008/05/18(日) 02:02:35
コードをすっきりさせてみた。 #include <stdio.h> int main(void) {/*ひし形*/ int i,j,max=9; max |= 1; for (i = 0;i < max; i++) { for (j = 0; j < max; j++) { printf( abs(i-max/2) + abs(j-max/2) <= max/2 ? "*" : " "); } printf("\n"); } }
コードを短くすればいいというものではない
>>860 >>858 のコードよりだいぶわかりやすくなってて
構造もきれいいいんだけど、
"*"表示の条件判定が初級者にはわかりづらくね?
#include <stdio.h> int main(void) {/*ひし形*/ int i,j,max=9; int kyori; int half=max/2; max = half*2+1; for (i = 0;i < max; i++) { for (j = 0; j < max; j++) { kyori = abs(i-half) + abs(j-half); if (kyori <= half) { printf("*"); } else { printf(" "); } } printf("\n"); } }
効率と可読性を犠牲にしてコードを短くすることになんの意味がある?
頭の体操にはなるな。
>>861 と
>>864 が何を言いたいのかわからないが、
>>860 はコードを短くしたいんじゃなくて制御構造を
すっきりさせたかったんだと思う。
少なくとも俺には3重ループx2よりは
2重ループx1の方が読みやすい。
つか効率については短いコードのほうが
優れてるのは一般的じゃないのか?
ついつい人目を盗んで書いちゃう自己流コーディングに対する一般論
>>864 モチベがあがる
一定レベルを超えれば、なにかしらの奥義発動もあるかも
…ただし、隙も増えるw
>>866 860と863が858より効率いいと思うんならプログラムはやめたほうがいい
この程度のプログラムで効率語っちゃいますか
3重ループが見える人には何いってもムダじゃね?
>860と863が858より効率いいと思うんならプログラムはやめたほうがいい そう思うやつはプログラマ向いてないなw
流れを読まずに俺のを投下w #include <stdio.h> #define MAX 9 int main(void) { int i, j, a = 1, n = MAX / 2 + 1; for(i=0; i>=0; i+=a) { for(j=0; j<n-1-i; j++) putchar(' '); for(j=0; j<=2*i; j++) putchar('*'); putchar('\n'); if(i==n-1) a *= -1; } return 0; }
出力結果が出たんならもう良いだろ・・・
お願い、宿題スレにきてください。もうたまっちゃって‥‥‥。
i<=max/2+1 だの j<i*2-1 だの、この辺りをもう少し変数を用いて省略した方が良いし
思いつきで書いただけだしw
>>860 は必要なヘッダがないよ。
>>863 が自分が思ったことを実行しているし、これが出た中では良いんじゃないの?
そろそろこの辺で。
やっぱこうだろJK。 #include <stdio.h> int main(void) { puts( " * \n" " *** \n" " ***** \n" " ******* \n" "*********\n" " ******* \n" " ***** \n" " *** \n" " * \n" ); return 0; }
AからZまでを表示するプログラムを作りなさい という問題で putc('A'); putc('B'); putc('C'); ・・・ と延々書いていた同級生を思い出した
>>877 HTMLの知識がないとここに正確に書き込むことが出来ない、JKw
可読性は大切な要素とおもう。その上で効率ではないだろうか?
>>874 の考えは大切だけどそれの取り組みは最終段階かなと思う。
C的には小さなパーツを構成してつくるってところじゃないだろうか?
引数渡して関数呼び出しなんて効率が悪いっていってしまうと以下のは無しになってしまうけど・
void put_char(char c, int n)
{
while(n-- > 0)
putchar( c );
}
int main()
{
int i;
const int Center_P = 9 / 2;
for(i = 0; i <= Center_P; i++)
{
put_char(' ', Center_P - i);
put_char('*', i + i + 1);
putchar('¥n');
}
for(i -= 2; i >= 0; i--)
{
put_char(' ', CenterP - i);
put_char('*', i + i + 1);
putchar('¥n');
}
}
int puts(const char *s) stdoutにsを書き込み、 改行を付加する。
なごんだw
>>877 と似たような事を書こうとして先に書かれたぜ
#include <stdio.h>
void main() { printf(" *\n ***\n *****\n *******\n*********\n *******\n *****\n ***\n *\n"); }
お前らいいかげん半角スペ(ry
くらい覚えろと?
そろそろFizzBuzz問題出してもいい?
半角文字列板でスペルマ放出ですね、わかります。
>>874 858と860・863をループでぶん回してかかった時間を計れば858が早くなるだろ
そもそもコードの長さは効率とは関係ないって言ってるのに、アセンブリの長さを持ち出すってw
むしろFizzBuzz問題より、ナベアツ問題の方がいい練習になると思いました
まぁ、absを呼び出しているところが、繰り返すと目立つ時間差として出てくるんだよね。 関数を呼び出すとそうでないと、差は微妙だがある。
関数の呼び出しじゃなくて二つのループを一つにまとめることによる条件分岐のほうだろ
条件分岐 も だろ?素人だなぁ・・・あんた
そろそろインラインアセンブラで俺最速みたいなやつが出てこないかな 別にそういう流れではない?
条件分岐も当然差として出るが、関数を呼び出すのもロスとして出るよ。 以前、うるう年を判断するコードで、同じものを関数にして呼び出したものと そうでないものとで比較したところ、1.5倍の差が出た。関数を用いない方で 20秒掛かったものが用いた方では30秒といったところ。内容はほぼ同じで 関数の方は値を返すところで違いはあったが。
>>889 これだからソフトだけしか知らんやつは・・・
命令をメモリからとってくるのにもコストかかるんですのよ。
全部CPUに命令が載るループは爆速
おまえら散々効率云々言ってるクセに実測しないとかwww
>>891 abs()呼び出しはinlineじゃないの?
まぁ環境依存かと思うが。
printfやputcharのコード全部がキャッシュに収まるといいね
だから前半と後半を別にすりゃ良いだろ?そういう考え方でも問題ないし そうすりゃ絶対値なんて使わずに済む
>>898 処理系で結果違うしなぁ。
それよりも短いコード(機械語的な意味で)が
効率と関係ないというやつは一生JAVAでも
やってればいいと思うよ。
>>900 ループ内で自前バッファに書いといて
最後に中出しすればおk
機械語的に短くすれば必ず効率がよくなるわけでもないだろ 短いけどムダの処理が重なってりゃ当然効率悪くなるんだし
総合的に判断する必要があるわけですな。
>>902 なぜかループを一つにまとめたがる時期ってのはあるんだよ。
だから実測しろと
普通に考えたらコードの短さと効率は関係ないだろ
そもそもが「配列を使わずに」とか言ってるコードで効率とか あ ほ か
>>905 一般論としてはそういうケースもあるだろうけど、
実際問題はあんまないぞ。
実行する命令数はあんまかわらなくて、
キャッシュ落ちしない分だけ早くなるのが多い。
まぁ命令をロードするのにどれくらいのサイクルが
必要かは効率を語る以上意識しないといけないな。
>>908 話もまとめてループし始めたような気が・・・
お前ら(俺含め)全員寝ろ
とりあえず、三角形と逆三角形を別に扱うってことでおk
命令のプリフェッチを意識すると、 32バイト境界も意識しないとな。
何の効率か曖昧なままの、妄想陳列の予感。
プリフェッチ回数が少ない方が効率がいいに決まってるじゃん。
この場合はどっちがプリフェッチ回数少ないのか具体的にplz
基本的には機械語コードが短い方だが、 ループが32バイト境界をまたぐ回数が多いと プリフェッチ回数が多くなってしまう。
923 :
デフォルトの名無しさん :2008/05/18(日) 12:52:15
>>プログラムを書いてくださった方 ありがとうございます。 しかしみなさんが書いたようなプログラムはまだ見たことがないようなものでして… できれば857が言ってるようにひし形の左側に必要なスペースの数を計算してfor文などを使ったプログラムにしたいのですが…。 *が7個の時は1個右に、5個の時は2個…のようにすればいいのかな?っていう考え方はなんとなく気づきました。 それをどう表してどこに書けばよいのか分からなくて・・・
858でいいだろ
925 :
デフォルトの名無しさん :2008/05/18(日) 13:04:23
この板よりも適切な板があるので、宿題スレに行きます。 ご迷惑をおかけしました。
さんざん答えがでてるのによそで聞くってか 宿題スレじゃ答えしか返ってこないぞ
928 :
デフォルトの名無しさん :2008/05/18(日) 14:01:12
858のソースはまだ習ってないpucharを使っているので だめなんです。
putcharを自分で調べるぐらいのこともできないのか
printfに変えろよ・・・
まだならってないのを使ったらダメってのがわからん。 逆に評価たかくなるんじゃないか? (pucharごときじゃあれだけど)
932 :
デフォルトの名無しさん :2008/05/18(日) 15:08:01
putchar でググれハゲ。
宿題なら宿題と言え
コンストラクタの関数ポインタを取得したいんだけど どうすればいいの?
無理
そこをなんとか
そもそもコンストラクタの関数ポインタが必要になってる時点でおかしい
そもそもCでコンストラクタとか言ってる時点でおかしい
Factory作るのに、サブクラスのコンストラクタのポインタだけ セットしてそれをたたいてほしいのねん。 素直にCreate()メソッド作ってそれ使ってもいいんだけど
Cにコンストラクタはありません C++スレで聞いてください
>>934 C++ スレじゃないんで、あえて聞くんだが、
コンストラクタって何?
おう、失礼。C専用スレか。 どうりで素人っぽい人しかいないと思ったw
おいお前らバカにされてるぞ
昨晩のようなことやらかした後ではバカにされても仕方がない
いいんでねぇの? あおってるのは、 「C++ 使ってもメモリリークしまくるコードしか書けない」 低能だろ?
ヽ(´ー`)ノ もう煽りはいやだよ
共用体ってどんな時に 使ったらいいんだ?
int ii = i == 0 ? num-1 : i-1; これはどういう意味ですか?
1つのオブジェクトを複数の型として使いたいとき 典型的な具体例は二つあって、 1つは抽象的な(中身にプログラマーがタッチしない)データ型を実装するときと、 もう1つはサイズが同じ複数の型が不規則に連続するデータ構造を (恐らくはファイルから)配列に読み込んで解析したいとき
>>948 if(i==0) ii = num - 1;
else ii = i - 1;
>>948 iが0ならnum-1をiiに代入、それ以外ならi-1をiiに代入
条件演算子でググれ
>>948 int ii = (i==0) ? (num-1) : (i-1);
?:演算子の意味がわからないなら教科書を読むこと
>>947 ちゃんとcastの意味が分かってて、cast を適正に使用できるのであれば
なるべく忘れた方がいい機能
下みたいな書きかたをして、通信相手に固定長のデータを渡すとき以外に
ご利益を被った記憶がない
struct pkt {
int pkt_type;
union {
char b_x;
struct char b_name[8];
} hdr_body;
#define pkt_x hdr_body.b_x
#define pkt_name hdr_body.b_name
};
上の例で union が裸で配列 1024 バイトなんかだったりすると
組み込み方面では、要りもしない領域をスタックに作られて
システムダウンする可能性もある
>>943 スレタイすら読めないヤツがスレ内容を理解できると思うか?
>>947 long(32bit)とshort(16bit)の配列を組み合わせて、
バラバラに取得するってのはたまにやるけどあまり使わない機能だな
char a[100]; sprintf(a, "abc"); sprintf(a, "abc%s", a); printf("%s\n", a); こんなことって、出来ないのでしょうか。Borland C++ 5.82なんですが。 素直にstrcat使えってことなのですかね。
>>956 sprintf(a, "abc%s", a);
こいつが、昔から実装依存。つか、規格(C89)的には動作未定義じゃないか?
C99 だと
sprintf(char * restrict str, ...
動作の保証は全くない
ありがとうございます。 しょうがないので素直にstrcat使うことにします
>>956 いまいち要求がわからんが、それはstrcatでもダメなのでは?
>>949 >>953 サンクス!
C言語始めたばかりの初心者だから
何いってるか分からないけどとりあえず
忘れる方向で行こうと思う。
>>947 >>960 処理側で要求されるデータが、バイトサイズ x 4 を
4バイト型に8bitシフトで格納されてる場合とか
グラフィック扱う場合とかで、RGBAの各バイト情報とかで結構あるよ
struct RGBA {
unsigned int rgba;
union {
unsigned char r, g, b, a;
};
};
こうしないと
#define SET_RGBA(r, g, b, a) ((r<<24)|(g<<16)|(b<<8)|a)
こんなマクロを組む必要になったり、
セットは言いが、各バイト情報を取得する時とかめんどう
g情報が欲しい時に、
((rgba
>>16 )&0x000000ff)
なんてするより共用体になってれば
.g
で終わり
>>961 あぁ, それだめ
ストリームに載ってきたときアライメントがあってる保証がない
全部書き直したことがある
VVVV これのバイトアライン適用可能版が一番堅実
> #define SET_RGBA(r, g, b, a) ((r<<24)|(g<<16)|(b<<8)|a)
アラインを意識するならpragmaなりなんなり使うだろ普通
unionを使うような処理って処理系に合わせて適時書き換えるもんじゃないの?
>>956 のやりたいことは、要するに文字列の先頭に追加できるかってことだろ。
1つのバッファでやる限り、自前で移動するんでなきゃmemmove以外では無理。
unionのあるメンバにつっこんだ値が別のメンバで(形を変えて)読み出せることは保証されていない(処理系によるので)。
規格に沿った正しい使い方は、メモリを節約することと、既に
>>949 と
>>953 で出たように固定長で型の違うデータの列を扱う場合。
numに与えられた2ケタの整数を1のケタ、10のケタの数に分解すして配列arrに収納する関数を作ろうと考え、以下のコードを書きましたが、うまくいきません。 なぜなのでしょうか、、、丸め誤差でも発生してるんでしょうか。 動作例: num=24ならば、arr[0]=2, arr[1]=4 void Breakdown(int arr[], int num){ double udp, odp; udp = modf((num / 10.0), &odp) * 10; arr[0] = (int)odp; arr[1] = (int)udp; }
arr[0]=num/10%10; arr[1]=num%10;
なんか自分の頭に悲しくなりましたorz 即答、ありがとうございますっ
972 :
デフォルトの名無しさん :2008/05/18(日) 22:06:53
今月の日経ソフトウェアTurboが紹介されてたんだけどどうなのかな やっぱVisualC++のほうがいい?
要求される.NETのバージョンが違う Turbo(IDE)はフォームに部品をぺたぺた貼って遊べるが、VCの無償版はやや難しいか困難 最新のSDKにあわせるなら、VCが無難…な気がするが、気がするだけかもしれない
.NET?
.NEET?
無関係だろ。だと正直いいんだが、IDEが.NETランタイムを要求するのさ コマンドラインコンパイルだけなら、.NET蹴って本体だけ抜いて使っていい
977 :
デフォルトの名無しさん :2008/05/18(日) 23:06:22
全くの初心者です。これをコンパイルしようとしたら 初期化されていないローカル変数 'a' が使用されます 初期化されていないローカル変数 'b' が使用されます って出てきますがどうやったらコンパイル出来るのでしょうか。 #include <stdio.h> #include <math.h> main(){ double a,b,c; c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3; printf("temperature="); scanf("%lf",&a); printf("moisture="); scanf("%lf",&b); if(c<77){ printf("9percent\n"); } else if((77<=c)&&(c<85)){ printf("65percent\n"); } else{ printf("93percent\n"); } }
aとbを初期化しましょう a= 0.0; b = 0.0;
>>977 > c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3;
この行は、scanf()のあとにあるべきだと思われ。
>>977 c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3;
この行を
scanf("%lf",&b);
の下の行に移動
981 :
デフォルトの名無しさん :2008/05/18(日) 23:12:02
>>978 おおw
出来ました。
これって数値代入のときには常に初期化が必要なんですか?
>>979 はい
982 :
977 :2008/05/18(日) 23:14:02
これはひどい
そもそも c=(0.81*a)+0.01*b*(0.99*a-14.3)+46.3; の行で何が行われると期待したんだ
>>981 宣言で常に初期化ってのは、お作法的によくない。
このコードでは、初期化はいらない。
986 :
977 :2008/05/18(日) 23:18:24
他の言語経験があるとみた Cでは、未初期化の変数はアリですけど、未初期化の変数は未初期化のままです たとえば、ほっといてもゼロになります。とかは【ない】です 一見不便ですけど、未初期化にいちいちゼロクリアがないという潔さは、魅力でもあるのです だが、初期化忘れというバグが後を絶ちませんので、 いまどき、未初期化の変数を使うと、ひっかかる処理系が多いですよ
988 :
977 :2008/05/18(日) 23:25:27
>>987 単純に知識が無さ過ぎるだけですw
4年機械系なのに今までサボりすぎてたから
独学でしようかと。。。
何言ってるんだ? 規格標的には bss は0クリアされている ポインタが NULL になっているか否かは処理系依存だが
スタックになるか、レジスタだけかもわからんね。 .bssだけはないわ
>>988 未初期化の変数、
>>989 の示唆を含めれば、こと少なくとも、警告を食らうようであれば、
その中身は不定とみるべきです Cは超少ないメモリの装置にだって使われるのですし、
何に使われたメモリが変数の格納領域に割り当てられるかわからないとみるべきです
sage
sage
sage
sage
sage
sage
1000ならC言語復興!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。