1 >> otu;
3 :
デフォルトの名無しさん :2009/03/27(金) 02:39:24
そもそも自然言語の使用頻度とプログラミング言語には直接の関係は何も無いし ましてCに関係のある話ではありえない
localeが"C"ってことで。
先にだすべきは「ネイティブスピーカーの数が多い言語一覧」じゃないだろうか つか使ってる人の数の多さよりも 使ってる文字の少なさの方が重要だと思うけど
C作文、C文解釈の授業ですか?
wiki貼り付けるだけのアホは日本語すらまともに使えてないがw
コンテナってないのけ? 自作しかない?
アク禁で遅レスだが前スレ
>>921 srand(5000)のとき黒が(5,6)に打ったあと発生。
白手番だが、次々手番で打つ場所がなくなるため評価値がINT_MINになる。
次のifが(cur>max)と">"なので、その座標がmainに帰されず、前回の黒手番と同じ座標に打とうとする。
cur>=maxにすればとりあえず回避はできる。(ただしmin-max法としては間違っている。)
1)min-max計算中にもパス判定が必要
2)相手が打てなくなってもそれが最良手とは限らない
なんか難しい方のスレで聞いちゃったみたいだからこっちで聞きなおしますね。 それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。 C言語は上から順番に処理されるんだよね。 そうすると、割り込むみたいなことは許されないんだよね? 例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理? for( ) ・・・・・・・・・ if(getchar 見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、 その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
>>15 うるせえよ
3つものスレにマルチしてんじゃねーよ
馬鹿の一つ覚えのスレ立てだけはやめようなw
20 :
デフォルトの名無しさん :2009/03/28(土) 01:00:08
>>4 あぁ、日本語が通じない馬鹿か、失せろ。お前の知能をどうにかしろw
お前が理解できないのは日本語もそうだが、内容もだろ?
そう、言葉は意味を理解してこそ理解に繋がる。
意味も知らずに子供が罵詈雑言や下品な言葉を使うのは、相手の反応で
楽しんでいることもあるが、大人になろうがそうでなかろうが、意味が理解できる人で
まともな知性の人は、まずお前みたいな稚拙な反応はしない。
スレ違い 失せろゴミ
22 :
デフォルトの名無しさん :2009/03/28(土) 01:05:31
12 名前:デフォルトの名無しさん 投稿日:2009/03/27(金) 14:19:37 wiki貼り付けるだけのアホは日本語すらまともに使えてないがw ↑こいつはwikiの内容が事実無根と言いたいんだろうけど、中には 主観的なことを書いている奴もいるからな。あくまでも参考までにだ。 事実無根、反することがあれば、どうぞそれに対して指摘をどうぞ。 とにかく、この世の人口なんて統治されていない国、紛争地帯では 実態が把握し辛いのが現状。自分が知った、思ったことが真実だと思うなってことだ。 で、英語が一番?だと思いたいんでしょ。母国語としてという話ではなくても 自分も英語圏以外の人と話すときは、何かと英語が用いられるけどな。 もう10年以上、大学の専攻分野の関係上、インターネットを使い続けているが アクセス制限をしていないのであれば、国境のない世界に、今こうして我々が 日本人が多く集まるコミュニティーで日本語を当たり前に見かけるとは言え 表示できる文字もPCの環境で違うとはいえ、PCの基本部分は何かと英語が 使われているからね・・・
では、日本語”すら”まともに使えていないというその理由は? ご自分はどうなの?間違った言葉は一度も使ったことがない? 結局、思想にまで話が及ぶから、それ以上言いたくないんだろ? そう、言葉には人間性が露呈していますからね。お前みたいに まともに使えないと相手を見下す言動を平気でする。 そもそも、こんな場所に畏まった、出版するような文章の記述をしろと?
マジキチw
話し言葉と書き言葉の違いも知らないとは・・・余程日頃、話し言葉を 使っていないんだな。孤立しちゃったタイプ?そういうのは必ずと言って良いほど 情報弱者とも言える発言をするよね。独りよがり。別に自分に対して直接 話を掛けてこられたわけでもないのに、何かと気に入らないものを見ては それに対して反発したり、物申したりする。あんたがどこの誰かなんて俺は知らない。 逆に、あんたも俺のことは知らないだろう。もしかすると、たまたま過去の知り合いだったら それはそれで面白いが、2ちゃんねるなんて不特定多数の人が来る場所だしね。 オフで会う人もいるしね。けど、俺はお前を知らない。戸籍があり特定できる個人だろうと 世間一般では知られていない人は多い。お前、どこに誰が住んでいるか事細かに知っているの? それはそれで、ある意味ストーカーよりすごいだろうね。
こいつがキチガイなのは昔っから スレ違いだというまっとうな指摘には一切反応しないのも昔っから
長文を書かない人がほとんどだから、長文ウザってなるんでしょ?別にこちらは あんた個人を特定して読めとも指図、強要はしていない。しかし、こちらも 間違っていない事実を述べているのに、それに対して反論されたらどうにもならん。 資料を提示しても、その資料が捏造だって言い出すんだろう? では、捏造だという証拠を提示し賜え。自分がそう思わない=捏造とは限らんよ。 また、捏造した場合、事実無根の内容として後で判明するだろう。 そもそも、ここはワープロソフトに記述している正式な文章でもない。 形式ばったものしかこの世には存在しないとでも?
間違い、不適切な箇所があるなら指摘し賜え。しかし、それをした時、間違いでも 不適切でもない部分を指摘してしまった時、自分の立場が悪くなるんだよね。 ありがち。前に句読点について指摘されたことがあるが、ではどこが?と訊ねたら 間違いではない箇所を指摘して墓穴を掘った人がいて、その後そいつは 何も言い返してこなくなった。自分が気に入らないだけでしょ? 間違いがあるなら、それは基準があってこそ。その基準が自分では曖昧。 客観性のある基準を提示すべき。要は目立つ奴が気に入らないんだろ? こちらは名無しで別にコテハンを名乗ってないんだから、目立たない無名だよ?w 高学歴だろうと全知全能で森羅万象を知り尽くした人などいない。限りある命、己も この世の一部のみを知り、そして後世に受け継ぐ。しかし、知らなくても良いことはある。 そう思うのもまた自分だ。知らないくせに知ったような口を聞いていると分かるのは、 真実を知っている人。資料を提示しても、それすら信用しないなら、もう何も信じるな。 己のみを信じろ。最後は孤立するだろう。
レスの行数による読まれる確率 1行=100%、2行=100%、 5行=30%、 10行=0.1%
これは!!!!!!!
>こちらは名無しで別にコテハンを名乗ってないんだから、目立たない無名だよ?w ここは笑うところ?
32 :
デフォルトの名無しさん :2009/03/28(土) 02:35:33
ポストスクリプトプリンタ以外は全て偽物のプリンタである。 よくありがちなWindows用のプリンタは偽物である。 それらは全て偽物である。 本物のプリンタとは *Linux* で使えるポストスクリプトプリンタの ことである。
Macじゃねーのかよw
Linux用のデバイスドライバを書くのがそんなに難しいのか? 例えばCANON PIXUS iPシリーズはMac用のドライバも出てる
最近ポストスクリプトプリンタの存在を知って大喜びで自慢してるつもりの低脳相手にすんなよw
992 名前:デフォルトの名無しさん 投稿日:2009/03/26(木) 23:10:42 世界的には日本語を使う人よりも英語を使う人の方が多い 前スレのこいつが必死なんだろ。日本語よりと比較したら間違いでもないんだが。
>>29 1行、2行でも長文に挟まれたレスはとばしてしまう
なんでスレタイも読めないゴミクズが、長々書き込んでるの?
うん、なんか悔しかったみたいよ。
int a printf("%p",&a) 結果↓ 0Xbfff30ca こんなかんじで 1Gのメモリ積んでるPCでも 2Gのメモリ積んでるPCでも アドレス番地が4バイト分で表示されるのは なぜなんでしょう? 実際はそんなにないはずですよね?
4バイト > 2G だから問題ないと思うが
>>41 >0xbfff30ca
2Gしか積んでいないのだから0xbfff30caなんてアドレスは存在しないと言いたいのでしょう。
簡単に言うと仮想アドレスだからです。
44 :
41 :2009/03/28(土) 14:14:37
ありがとうございます 物理メモリとか仮想メモリとか HDDへスワップさせるとかこういうことだったんですね。 理解が深まりました。
理解できたのなら、具体的に書いてみよう。
できれば他所でね。
自分一人なんてこの世の、今では70億人に迫る人口の中の一人に過ぎず 生活スタイルから何まで、集団の中に似た人はいても全員に共通しているわけでもない。 ましてや世界レベルとなれば、同じ国でも地域によってかなり異なることも。 英語が一番?やはりメリケンに洗脳されたか? あちらは今や、黒人初の大統領。しかし、島国日本に近いのはユーラシア大陸だぞ? 南米のブラジルは言うまでもなく公用語は英語ではないよ? ただ、どこの国でもPCの基本部分は何かと英語が用いられているようでw しかし、それはあくまでも日常生活、会話での話ではないんだよ、ホームズ殿。 知らない人からしてみれば、もはや文字、言葉とかではなく記号のようなもの。
あいかわらす長文なのに中身がなくて、当人のバカさ加減だけが際立つな
何を言いたいのか当人が分かってないから仕方が無い
>48-49 そんなこと言ったって、またうざいレスが返ってくるだけだからスルーしろ。
//相異なる四つの数字の並びを生成して配列xに格納 void make4digits(int x[]) { int i, j; for (i = 0; i < 4; i++) { do { x[i] = rand() % 10; for (j = 0; j < i; j++) if (x[i] == x[j]); break; }while (j < i); } } 4つの異なる数字を並べる関数なのに開始すると同じ数字が 出てきて困る。一体何なんだろう?
キーワード: 疑似乱数 srand
だから単文でも{}で括れと バグの発生を抑えたいなら
前スレで&(アドレス演算子)は配列名に付けられないと書き込んだが
付けられると訂正する
※検証結果は後述
ただMSDNでは以下のように記述されている
ttp://msdn.microsoft.com/ja-jp/library/caaw7h5s.aspx The address-of operator can only be applied to variables with fundamental, structure,
or union types that are declared at the file-scope level, or to subscripted array references.
MSDN ライブラリ Visual Studio 6.0
アドレス演算子を使えるのは、ファイル スコープ レベルで宣言されている基本型、構造体型、
共用体型の変数、または添字付きの配列参照に限られます。
// VC++6.0 SP6 #include <stdio.h> void main() { char ac[10]; char *pc1; char (*pc2)[10]; pc1 = ac; pc2 = ∾ printf("%p %p\n", pc1, pc2); } ・実行例 0012FF78 0012FF78 &無しと&付きは共に配列の先頭アドレスを指すのだが 何が違うかといえば「データ型」が違う
// VC++6.0 SP6 #include <stdio.h> void main() { char ac[16]; char *pc1; char (*pc2)[16]; pc1 = ac; pc2 = ∾ printf("%p %p\n", pc1, pc2); pc1++; pc2++; printf("%p %p\n", pc1, pc2); } ・実行例2 0012FF74 0012FF74 0012FF75 0012FF84 ポインタをインクリメントしてみるとデータ型の違いが明らか
char (*pc2)[32]; pc1 = ∾ pc2 = ∾ warning C4047: '=' : 間接参照のレベルが 'char *' と 'char (*)[16]' で異なっています。 warning C4048: 'char (*)[32]' と 'char (*)[16]' で配列の添字が異なります。 ・実行結果 0012FF74 0012FF74 0012FF75 0012FF94 ソースを少しいじってみたが警告は出るもののコンパイル可能 特にchar*への代入は&無しでも&付きでもアドレス自体は同一で 挙動にも異常はないため「&あってもなくても同じじゃん」と認識されるやもしれぬ
MSDNが間違ってるだけじゃないか
マニュアルが間違ってるのはよくあること(そしてそれが放置されるのも) pc1 = (char*)∾ は厳密に言えば正しくないのだが、警告も出ず正しく見えてしまう罠
ttp://kmaebashi.com/programmer/pointer.html 配列→ポインタの読み換え
式の中では、配列は「先頭要素へのポインタ」に読み換えられる。
int a[10];
の時、式の中では、a と &a[0]は同じ意味となる。
ただし、以下の個所は例外である。
1.sizeof演算子のオペランド
sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。
2.& 演算子のオペランド
& 演算子は、配列全体のアドレスを返す。
配列から読み換えられたポインタは左辺値を持たないため、 & 演算子のオペランドにはならないはずであるが、
この例外規則のため、 & でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が 取得できる。
この規則は初心者を混乱させることがある (例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても
正常に動いてしまう(正常に動いたように見えてしまう)が、 メリットは今ひとつわからない。
3.初期化時の文字列リテラル
char の「配列」を初期化する場合の文字列リテラルは、 中括弧内に文字を区切って書く初期化子の省略形である。
char の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。
SDLでゲームを作るにあたり参考になるサイト、書籍などオススメのものはありますか?
test
SDLって何だ? Service Description Language Microsoft社が提唱していた、Webサービスの機能を記述する言語。 引数・戻り値・処理内容などを記述する、XMLベースの言語である。現在はSCLに吸収され、さらにSCLはWSDLに吸収されている。 …初めて聞いたけど、XMLベースならとにかくC系言語ですらなさそうだな。
Simple DirectMedia Layer じゃあSDMLじゃないのかという突っ込みは無し。
71 :
68 :2009/03/31(火) 21:15:17
72 :
デフォルトの名無しさん :2009/04/01(水) 01:07:27
typedefについて教えて下さい。 解析をしていまいちピンとこなかったので。 SIGNALKIND Kind; PROCESS PId; unit16 Chcnt; 上記の三つの変数はtypedefで作成した型です。 実際はSIGNALKIND=unsigned long、PROCESS=unsigned long、 unit16=unsigned shortです。なぜ、わざわざこのようなことをするのでしょうか? 実際ソースではシグナルの構造体のメンバの一つとしてに使われております。 typedef struct Request_Signal { SIGNALKIND Kind; PROCESS PId; unit16 Chcnt; }Request_Signal; よろしくお願いします。
>>72 組み込み型にtypedef する理由は
分かりやすくする、後で実際の型を変更できる
というのがあります
>>72 >>73 の説明で良いだろうが、要は#define MAX_NUM (100)とかするのと同じ発想。
75 :
72 :2009/04/01(水) 01:24:18
>>73 早速のレスありがとうございます。
今度、自分も型を作成し構造体を定義しなければならないのですが、
どのようなことを考慮して定義すべきでしょうか?
実際、定義すべき構造体は、
用途:文字データ送信のシグナル構造体
メンバ:データの種類・データ文字数・文字データ
>>75 実際のデータ型を隠蔽するのが目的だから、メンバの意味を表現する型名として、
またそこに入れる値もなるべくならenumか#defineでシンボル化する
あとは名前空間を汚染しないようにすること
77 :
72 :2009/04/01(水) 01:38:56
>>76 ありがとうございます。
>実際のデータ型を隠蔽するのが目的だから
ということは、構造体定義ヘッダと型定義ヘッダは分けたほうがよいのでしょうか?
そういう話ではない?
unsigned 〜をtypedefするのはタイプがめんどいからだと思う
すいません。 forを使って%cで一つずつhenkan[5]の中身を出力すると上手くいくのに、 それ以外だと " ollehフフフフフフフフフフフhello "と出力されてしまい上手くいきません。 何が原因なんでしょうか? #include <stdio.h> main () { int i,j=4; char mojiretu[] = "hello"; char henkan[5]; printf("mojiretu = %s\n",mojiretu); printf("文字を変換します\n"); for( i=0; i<=4;i++,j--) { henkan[j] = mojiretu[i]; } for( i=0;i<5;i++){ printf("%c",henkan[i]); } printf("\n\n"); puts(henkan); return 0; }
mojiretu[0]='h'; mojiretu[1]='e'; mojiretu[2]='l'; mojiretu[3]='l'; mojiretu[4]='o'; mojiretu[5]='\0'; henkan[0]='o'; henkan[1]='l'; henkan[2]='l'; henkan[3]='e'; henkan[4]='h'; char henkan[6]; と宣言し henkan[5]='\0'; が必要
>>79 henkanが '\0' 終端していない。
>>79 変換先の文字配列のhenkanが終端文字でターミネイトされていないから。
henkanの5番目の要素はそのプログラムでは未初期化。
あーすまん。helloで5文字か。
>>80 の言う通りhenkanは6要素必要だ。
// 見本 #include <stdio.h> #include <string.h> int main() { char mojiretu[] = "hello"; char henkan[256]; int len; int i; printf("mojiretu = %s\n", mojiretu); len = strlen(mojiretu); for (i = 0; i < len; i++) { henkan[len - 1 - i] = mojiretu[i]; } henkan[len] = '\0'; printf("henkan = %s\n", henkan); return 0; }
85 :
79 :2009/04/01(水) 09:43:37
\0 が入っていなかったのが原因ですね。 ありがとうございました。
すいません。 文字列の中から特定の単語を検索するようなものを作ったんですが、上手くいかないんです。 検索する文字列と単語を日本語でなくって英数字にすると上手くいくんですけど どうしたらいいのでしょうか? #include <stdio.h> #include <string.h> main () { int i,j=0; char mojiretu[] = "あいうえおかきくけこ"; //検索される文字列です char kensaku[] = "おか"; //検索する単語です printf("文字列の中から、「おか」という単語を検索します\n"); for( i=0; i < strlen(mojiretu); i++) { //文字列の長さの分だけ繰り返します while ( mojiretu[i] == kensaku[j]) { j++; //jの値に+1します } } if ( strlen(kensaku) == j ) printf("検索成功\n"); return 0; }
2バイト文字だからどうたらじゃね
strstr 使っちゃダメなの? (日本語対応というか マルチバイト文字列対応は別においといて)
英数字だろうと上手くいくような気がしないんだが・・・ whileでjだけ進んでくのはおかしかないか?
>>89 処理としてはおかしいが
結果としてはif条件を満たす
char mojiretu[] = "abcdefghijkl"; char kensaku[] = "afl"; でも成功になるような。 char mojiretu[] = "abcdefghijkl"; char kensaku[] = "aaa"; でも成功になるような。
なんで2回書くの? なんで2回書くの?
大事なことは2回書くものだ
while(mojiretu[i+j] == kensaku[j]) j++; じゃねーの?
97 :
86 :2009/04/01(水) 14:23:10
>>87 やっぱりそうですよね・・・
>>88 strstrって何だって思ってググってみたんですけどこれ便利そうですね
ありがとうございます
>>89 確かにifでやった方が良かったかもです。
>>91 あ、確かにそうみたいです。直さないと・・・・
sinとcosなんですけど。 0・90・180・270を渡しても -1と1が返ってこないです。 バグですか?
でも、ほぼ1と-1だろ、0.99999...のような。 実数演算は近似計算だから、どうしても誤差からは逃れられない。
度
cos(0)は1だろ
らじあんでOK
#include <math.h>しとけって落ちだったりしてw
>>98 初心者のうちはコンパイラのバグという高尚な敵と戦えるような高度なコードは書けないから
自分が間違っていると決めつけた方がいいよ。
g++で
const double PI =3.1415926535;
std::cout << std::sin(0.0) << std::endl;
std::cout << std::sin(90.0) << std::endl;
std::cout << std::sin(180.0) << std::endl;
std::cout << std::sin(270.0) << std::endl;
std::cout << std::sin(0.0 /180*PI) << std::endl;
std::cout << std::sin(90.0 /180*PI) << std::endl;
std::cout << std::sin(180.0/180*PI) << std::endl;
std::cout << std::sin(270.0/180*PI) << std::endl;
としてみたら
0
0.893997
-0.801153
-0.176046
0
1
8.97932e-011(つまり0)
-1
となった。
C言語でも同じだろうな。
要するに技術屋なら 度数法°でなく弧度法radでやれ、ということだ。
>要するに技術屋なら 度数法°でなく弧度法radでやれ、ということだ。 WWWWW
windowsの電卓だと度だったよ
>>108 windowsの電卓は一般ユーザー向けだからだろ。
いやしくも理数系人間を対象にしていたらradだろ。
>>105 ,108
「Cライブラリの三角関数系は弧度法を使ってるものが多い」
まではおk。
だが「技術屋なら弧度法を使え」というのはNG
技術屋じゃないことがすぐわかる表現だなw
>>109 Windowsの電卓にも関数電卓モードがあるだろ
そもそも関数電卓モードにしか三角関数はないと思われ
>>110 単位radってとこまでC標準の仕様じゃないの?
所詮一般ユーザー用の関数電卓なんだろ。
>>113 ルール違反をした場合はC処理系の仲間はずれにするかも
といった程度の協定事項に過ぎないと思われ
117 :
デフォルトの名無しさん :2009/04/04(土) 22:40:21
#include <stdio.h> main() { char *p; char a = 'A'; char b = 'B'; char c = 'C'; p = &b; printf("%x : %c\n", p, *p); p++; printf("%x : %c\n", p, *p); } 上は「基礎からのC言語」(内田保雄)という本のプログラムですが 私のPCでコンパイルすると 'c'に代入した値は使われていない(関数main) 'a'に代入した値は使われていない(関数main) という警告文が出てしまうんですが。
字面通りの意味だけど。 というか、その本については全然知らないけど「基礎」でそんなことやってしまっていいんだろうか。
>>115 そのように解釈してくれるユーザーばかりではないから
警告過多なコンパイラが多くなってしまった。
警告が出ないようにコードを修正することはバグを
防ぐという意味では良い結果につながることが多いが
セキュリティーの観点からいろいろと細かいコーディング
ルールを設定している開発現場は多い。
そういった場合に警告が邪魔で仕方が無いので
警告を抑止した結果重大なバグが発生してしまった事例
が少なからずある。
>>117 警告をどう判断するかは人間しだい
「それは判ってる。コードはそのままで構わない」
「おっとこれはまずい。コードを修正しよう」
お好きなように
>>117 >>118 の言う通り、字面通りの意味だな。
コンパイラが警告文を出してくれるのは親切の意味であり、別に必ずしも従う必要はない。
分かっててやってるならね。
…と思ったら既に
>>120 が似たような返事してくれてたか。
度数が許されるのは小中学生までだろwww
>>119 2chビューアみたいな、
警告あぼーん機能
があったら便利そうでないか?
あるだろ?
#pragma warning(disable: 4996)
>>124 あれ?あるっけ?
個別のプロジェクト毎に好きな種類の警告を簡単に一つずつあぼんしていくのを想定している。
よー分からんが、IDE次第ではあるのかな。
>>125 個人的にはIDEの設定として欲しいなぁ。
マクロはいやぁん。
>>119 ☆コンパイラの出す警告はそれなりに的をついており
その原因をfixすることはコードの確実性には寄与することが多い。
☆しかし実際の開発現場ではローカルコーディング規約などの
制限から、コンパイラに完全に警告を出さないコードを書くことが
出来ない場合がある。
☆警告は煩いのでオプションで抑止するケースが多いが
このことが本来警告を真面目に受けて対応していれば
回避出来たバグの発生の原因になっているかも
ってこと?
なるほど,とうとうC/C++もIDEと合体販売しかしなくなったのですね?
>>129 別にそんなこと言ってないが、そう読めた?
>>122 技術、特に土木建設関係では度数法が厳然と主流
>>127 オプションに/wd4996って入れればいいよ
μm以下の精度が要求される、精密機器の検査装置のステージも、許容θ精度はμ°単位だったり。
134 :
デフォルトの名無しさん :2009/04/05(日) 02:35:36
彼女作るにはどうしたらいいんだ
作るんじゃない 出来るんだ
136 :
デフォルトの名無しさん :2009/04/05(日) 04:20:18
#include <stdio.h> 【 1 】 /* 文字列の標準ヘッダーファイルの取り込み */ #define TRUE 1 #define FALSE 0 int passCheck(char *p); /* ユーザー作成関数のプロトタイプ宣言 */ void main() { char buff[256]; int cnt, flg = FALSE; for (cnt=1; 【 2 】 ; cnt++) { printf("パスワードは?=> "); scanf("%s",buff); flg = 【 3 】 ; if (flg == TRUE) printf("パスワードは合致しました。\n"); else printf("%d回目 入力ワード %s は間違っています。\n",cnt,buff); } }
137 :
デフォルトの名無しさん :2009/04/05(日) 04:21:42
int passCheck(char *p) { static char *pass = "MissionC"; int flg; flg = strcmp(pass,p); if (【 4 】 ) return TRUE; else return FALSE; }
138 :
デフォルトの名無しさん :2009/04/05(日) 04:22:57
1,2,3,4に入る解答を教えてくださいな。
140 :
デフォルトの名無しさん :2009/04/05(日) 05:13:42
いいから教えてくださいな
こういう奴が出世遅れるんだよな
>>141 どっちが出世が遅れる?教わるほう?それとも教えるほう?
143 :
デフォルトの名無しさん :2009/04/05(日) 05:28:33
早く教えて
144 :
デフォルトの名無しさん :2009/04/05(日) 05:30:10
わかんねーのか?
ここにいる奴ら全員にきまってるだろ
TRUEとFALSEってどのヘッダーに入ってるのが普通というか 取り込んでれば無難ですかね? gcc環境下で組んでるんですが、ネットで調べたstdio.hを取り込んでも 使えません・・・
148 :
デフォルトの名無しさん :2009/04/05(日) 09:16:53
ないものはないと割り切れ
ないものはないで割り切ろうとしたら 0 除算エラーになりました
>>149 そうそう
調べてると環境によって0&1でよくないケースもあるようで
なるべくは自前で入れたくないんですよね・・・
gccなら<stdboo.h>でbool型のtrue/falseでいいじゃない。
出来るだけ静的関数にしたほうがいいのけ? 友達に言われたんだが…
153 :
136 :2009/04/05(日) 12:52:42
いやマジで答えろよ 質問してんだろうが。
>>153 だからそういうのは宿題スレでお願いしなさい
157 :
150 :2009/04/05(日) 13:07:14
158 :
デフォルトの名無しさん :2009/04/05(日) 13:14:35
>>138 【1】以外全部0でおk
【1】は空
べ,べつにあんたの単位なんてどうでもいいんだからね・・・///
stdboo.h 見苦しくしてまで一文字省略する意味がわからない
ごめんただのtypo
161 :
デフォルトの名無しさん :2009/04/05(日) 17:30:03
標準ブーイング
スタンド・ブーイング
ブーイングするためにだけ存在するのか。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9016.txt 1000×1000の行列ベクトル積の計算プログラムが課題として出たのですが、デバッグするとよくわからないエラーが出て困っています。
'行列ベクトル積.exe': 'C:\Documents and Settings\管理者\My Documents\Visual Studio 2005\Projects\行列ベクトル積\debug\行列ベクトル積.exe' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\msvcrt.dll' を読み込みました。シンボルが読み込まれていません。
行列ベクトル積.exe の 0x00411ab7 で初回の例外が発生しました: 0xC00000FD: Stack overflow
行列ベクトル積.exe の 0x00411ab7 でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow
プログラム '[10012] 行列ベクトル積.exe: ネイティブ' はコード 0 (0x0) で終了しました。
;が無いとかで怒られたことはありますけどこういう形のエラーは初めてです。
プログラムを組むのが1年ぶりくらいなので、もしかしたら基本的な見落としをしているのかもしれませんがさっぱり原因がわかりません。
どうかよろしくお願いします。
>>164 原因は書いてあるそのまま。
Stack overflow
166 :
150 :2009/04/06(月) 18:04:53
>>164 問題はこれ
int a[1000][1000];
int x[1000];
int b[1000] = {0};
前にもスタックにdoubleの配列を大量に確保しようとしてたやついたな
メモリの確保については教えてくれないのか?>ちぇんちぇえ
うわw なんか名前書き込んでもた
int a[1000][1000]; はintが4バイトだから4x1000x1000で約4メガバイト exeってなってるからVisualC++あたりと想定して、 デフォルトのスタックサイズは1MBだから、スタックオーバーフローですな。 スタックに置かないか、スタックサイズを大きくするかだな。 自動変数はスタックに置かれる。
stack size を大きくするか stack を使わないように static にしたり 動的確保でヒープ領域を使ったり
static int a[1000][1000]; static int x[1000]; static int b[1000] = {0}; とりあえずはこれでOK?
staticつけると0クリアしてくれるんだっけ? static int b[1000]; これでいいか
static と auto は使い分けだな auto は関数内でしか使わない変数向き 関数内 static は関数内で静的に確保したいとき グローバル static はプログラムが動いてる間確保したいとき 本来 auto で確保したいけど stack を無駄に大きくしたくないのであれば 緊急避難的に関数内 static を使うのがいいんジャマイカ
>>172 で、マルチスレッド対応時に あー ってなると
174 :
164 :2009/04/06(月) 19:45:33
皆さんどうもありがとうございました。
>>170 さんの通りにしたらきちんと動くようになりました。
ところで結果表示の時に701〜999、までしか表示されないのは単に表示行数の問題でしょうか。
>>174 コンソールアプリだとウインドウが管理できる行数がデフォルトで
決まってるので最後の方の結果だけが残ってる可能性が
コンソールウインドウの設定を変えてログ行数増やすとかしないとだめかな?
176 :
デフォルトの名無しさん :2009/04/06(月) 20:11:14
> 本来 auto で確保したいけど stack を無駄に大きくしたくないのであれば 無駄??
>>175 わかりました。ありがとうございます。
結果の表示はしなくてもいいのでとりあえず無くすことにします。
MSCの頃はスタック最大で64KBしか取れなかったけどさw
>>180 !!
ありがとうございます。目が疲れていたようですw
scanfでdouble型を受け取るときは%lf これ常識
手元にあるQuickC Ver.2.0の入門書で確認したらデフォルト2KBだった スタックオーバーフローしたら無闇に増やすより 真っ先にスタックから静的変数領域に追い出したな
186 :
デフォルトの名無しさん :2009/04/07(火) 13:39:02
for(;;){ printf(":"); if((command = getchar()) == 'a') addlist(); else if(command == 'b') delete(); else if(command == 'c') showlist(); else if(command == 'q') exit(0); else puts("Illegal command"); puts(""); }; 上記はmain関数内の繰り返しで、結果が以下のように出力されます。 ******************************************************** <---ここから :a <---for(;;){}内のプロンプトが表示されaddlist()を実行した >34 <---addlist()のプロンプトが表示され34を入力した :Illegal command <---ここが原因のわからない表示 : <---addlist()実行後に復帰してfor(;;){}内のプロンプトが再び表示される ******************************************************** <---ここまで 実行環境:cygwin gcc versin 3.4.4 どうやら実行後に復帰したプロンプトが表示される前に、一回多く繰り返しを行っているようなのですが、 なぜ繰り返しが起こるのか、原因の見当がつきません。 このようなことが起こる原因がわかる方がいたらどうぞ教えてください。
188 :
デフォルトの名無しさん :2009/04/07(火) 15:05:36
>>187 ありがとうございます。
解決しました:-)
俺の上司、コーディングとデバッグを分けているらしく、コーディング工程の間は一切プログラムの動作確認をしない。 プログラム全体を一気に書き換えた後に、デバッグ工程の俺にプログラムが送られてくるわけだが動作どころかコンパイルすら通らない。 このやり方では確実に見つけにくいバグが紛れ込むと思うんだがこういう手法って一般的なんだろうか。
>>189 日本はそうやってゼネコンが作ったシステムのまねをして分業化する。
だからIT土方と言われる
>>189 上司の名前を使って、バグだらけのコードをわざと書いて
デバッグ工程に回すのが吉
それで上司が文句を言ってきたら、「責任を人になすり付ける会社」
としてさっさとその会社に見切りをつけることが吉。
>191は何をしたいのか判らんが、会社に見切りをつけると言う点では同意。
>>189 たとえデバッグを他人に押し付けても
自分が一番作った気になれる部分じゃん
本人はそれで満足したいんだよ
>>189 そもそもコンパイルが通っていないなら、コーディングが済んだとは言えんだろ。
そもそも普通の会社なら、単体デバッグはコーダーの仕事だ。
コーダーどころか入力だけならパンチャーレベル
他所でやれ
>>189 それで仕事になっているということは、
君がすごいんじゃないか?
普通に考えて、デバッグのがしんどいだろ。
他人のデバッグなんてホントに難しいってか…(ry
やっぱりうちの会社って普通じゃないんだな…転職考えるか。
是非弊社に。適職フェアでお待ちしてます。
御社はプロのデバッガをお望みという事ですね とても関心いたします
他人が動作確認もしないで適当に書いたコードを修正できるなら、 最初からその人が書いたほうが早いんじゃねーか?
>>202 そう思わない駄目上司がいるからIT業界は概ねブラックで
そういうシステムだからこそIT土方と言われるんだし・・・
204 :
198 :2009/04/10(金) 07:02:09
>>202 俺のレスの
>他人のデバッグなんてホントに難しいってか…(ry
この
…(ry
の部分がまさに君の
>最初からその人が書いたほうが早いんじゃねーか?
だ。同意。
つまり、そんな阿呆な上司のコードをデバッグできる>189は意外に使えるかもしれないってことか。
206 :
198 :2009/04/10(金) 17:28:26
プロジェクトとして考えたら、他人のプログラムをテストしデバッグすることはよくあること。 コードはプロジェクトの共有物なんだから
208 :
デフォルトの名無しさん :2009/04/10(金) 21:26:48
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int sum; int table[10]={1,2,3,4,5,6,7,8,9,10}; int i; double ave; i=0; ave=0; sum=0; for(i=0;i<10;i++) { sum+=table[i]; } ave=sum/10; printf("%d",ave); system("PAUSE"); return 0; } これをコンパイルして実行しても結果が0にしかなりません。 どこがおかしいのでしょうか? 教えてください
%dだから? 書式を調べたほうが
>>208 あと、aveをdoubleにしても、ave=sum/10.0; とかにしないと、少数が切り捨てられる。
212 :
デフォルトの名無しさん :2009/04/10(金) 21:38:09
答えてくださった方ありがとうございましたpwq 無事に実行できました。わからなく、モヤモヤしてたので助かりました。 ホントにありがとでした><
>>210 そこはなかなか読んでダメになるサイトですね。前にも他のページで指摘しているけど、今回はこれを見つけた。
>\' 文字としての ' 2C
asciiの0x2cはいつからシングルクォートになったんだかw
>>207 こんな理解力の無い奴もプログラマやってんのかな
#include <stdio.h> main(){ int a,b; scanf("%d",&a); scanf("%d",&b); printf("%d + %d = %d",a,b,a+b); return 0; } を実行したとき、数字以外を入力すると 1 + 256 = 257 となります。 数字以外が入力された際、エラーメッセージを表示して再入力を促すようにしたい場合 どうしたらよいでしょうか?
#include <stdio.h> main(){ int a,b; do{ scanf("%d",&a); scanf("%d",&b); }while(a<'0'||'9'<a||b<'0'||'9'<b); printf("%d + %d = %d",a,b,a+b); return 0; }
if (scanf("%d", &a) != 1) { printf("error\n"); continue; }
2chでタブってどうやって入力するの
◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
scanfで値を受け取って、その値を配列の要素数にしたいときはどうすればいいんでしょうか? 要素数には定数しか使えないと解説書にあったのですが・・・
malloc
std::vector
>それが使えない環境 って何?古い環境で保守、ってこと?
>>222 ぐぐり方が足りないようでした
DOOMすいませんでした
>>228 VCが対応していないしな。
いまだに新規開発でもC90を使っているところが多いんじゃないかな。
VC++2008は古くないと思うな
というかC自体が・・・
C++がCの拡張とは言え、C言語はまだ根強く残って使われる。 それだけ使いやすい言語だという事だよ、ワトソン君。
C99はC++とも相性が悪い。
読み飛ばさないと駄目だな。
それと
>>217 もひどすぎるw
scanf()は使うなってアドバイスするのが正解。
初心者はCを使うべき
scanfが完全にだめだと思う奴は素人。使い方次第。
>>240 そりゃまあ使い方次第だが。。。
そんな言い方したらgoto文も同じだよね。
全然違う
scanfは全く使うべきでないがgotoはそうではない。
245 :
241 :2009/04/12(日) 15:52:08
scanf()で悩んでる初心者に、それは使わないほうがいいよって アドバイスするときに添える理由。 ・他の入力関数にくらべて挙動に癖があって初心者には使いにくい。 ・がんばって挙動に精通しても実践の場で使うことはほとんどない。
scanfが使い方次第だと思う奴は素人。完全にだめ。
scanf()はパンチカード時代の遺物 キーボードとは相性が悪い
でも入門書にはscanfしか載ってないけど・・・
>>249 入力と数値の変換を同時にやるから、説明が簡単だっておもっちゃうのかね。
教わる側からすると、エラーリカバリとかやろうとするととたんに難しくなるな。
>>247 素人乙。お前みたいな固定概念しかない奴は応用力がない。
一生あれもこれも欠点を持ち出して駄目だといい続けてな。
現に、お前が使っている言語もOSさえも、完璧なものはない。
そもそも、どういった場面でscanfは駄目か?について まったく説明ができないくせに、駄目だとされるものがあれば もうそれは駄目。自動車で悲惨な事故が起こる、航空機は墜落したら 大惨事、人間は生きているだけで老化してやがて死ぬから駄目 といっているようなもの。進歩のない奴はいつまでも発展しないまま 情報弱者のくせして知ったかぶりでこの世を去るんだろう。
完全に駄目なら、それを使っている教本も駄目だな。 リストアップして出版社にクレームをしておけよ>知ったかぶりのscanf駄目厨
どーでもいいよ お前ら全員うるせーな 俺はC++大好きっ子だからもうC言語なんてどうでもいい環境なんだよ。 ・・・は言い過ぎだけど、scanfが便利だろうが便利じゃなかろうが関係ない環境であることは確か。
・エラーリカバリがすっきりしない ・バッファの消費が書式文字列に依存して、ほかの入力関数とまぜて使いにくい ・数値のオーバーフローに対応できない ・文字列のバッファーオーバーフローの対応が 書式文字列に定数でバッファ長を埋め来なくてはいけなくて ださい。(もしくは書式文字列を実行時作成するとか)
この世に完璧なものはない。strcpyだって危険だが、その説明はできるか?>scanf駄目ぽ情弱素人
strncpy使えw
>>256 scanf()がだめな理由を言えって言うのに、それが述べられても反論はしないんだな。
完璧なものはないかも知れないが、70点と30点には明確な違いがある
使い方次第って言ってる奴が使い方を全く提示しないのが笑える
int a[10]; としても添え字でa[10]とかそれ以上の番号を指定できるから これも駄目ね。使った奴は素人w
>>261 配列は配列を使う以外の簡単な改善案がない。
scanf()はほかの関数を使えば簡単に解決できる。
皮肉で言ったつもりなんだろうが例が悪い
入門書のサンプルでしか使わないような関数だから、がんばって 問題点を克服するより使わないってのが一番簡単な解決策。
こりゃもうscanfをあぼんするしかないな。 きっとすっきりするぞ。
scanfは使わないけど、sscanf は使うぞ 初心者は、文字列扱うときにstr系関数を組み合わせて苦労して 複雑なプログラム作るけど、慣れた人なら sscanf ひとつで 済ませられたりする scanfは使わないけどscanfの書式(とくにスキャン集合)は 知っておくべき
融通の利かなさはscanf()譲りだがな。
scanf系が無かったらと思うとゾッとする
scanf()系で使うのはsscanf()くらいだな。
scanf厨のキチガイっぷりは凄いな。
scanfを使うより fgetsとsscanfをセットで使え
272 :
デフォルトの名無しさん :2009/04/12(日) 20:30:06
#include<stdio.h> 2 3 int main(void){ 4 struct tag{ 5 char str[6]; 6 }aa; 7 aa = *(struct tag *)"HELLO"; 8 printf("%s\n",aa.str); 9 return 0; 10 } /*実行結果*/ HELLO aa = *(struct tag *)"HELLO";の部分が説明を読んでも 何をやっているのかわかりません。 だれか教えてください。
>>272 そんなしょうもないコード、誰がどこでどんな説明を書いているの?
>>272 "HELLO" のある領域を構造体だと思って読み出す感じ
やろうとしてることはわかるけど教材用としてこんなソースよこしたのかな?
説明できんこともないけど面倒くさいんでパス memcpy(&aa, "HELLO", 6); と同等
277 :
デフォルトの名無しさん :2009/04/12(日) 20:47:30
>>275 教材のソースです。
文字列は配列なので代入できないが、構造体をつかうとできるということを
説明してあるようなんですが、よくわからないのです。
カスだな、その教材。そして無視される>273w
>>277 まあ理解しつつも、心の中ではこんなカス教材よこしやがってと思ったほうがいいねw
いつの時代のPGやねんと
280 :
デフォルトの名無しさん :2009/04/12(日) 20:54:18
あと宿題スレとかでたまに見るBMPの読み込み関連とかも糞教材だよな 普通つかわねーだろと
真面目に答えてみるか aa = *(struct tag *)"HELLO"; 「(struct tag *)"HELLO"」はchar*をstruct tag*にポインタ型を変換してる 「*(struct tag *)"HELLO"」はstruct tag構造体として扱われる 「aa = *(struct tag *)"HELLO"」でaaに*(struct tag *)"HELLO"を構造体コピーする
283 :
デフォルトの名無しさん :2009/04/12(日) 21:15:51
>>282 丁寧な回答ありがとうございます。
考えてみます。
ところでみなさんとても詳しいですね。専門の方ですか?
あと、こんなにすぐに返答を頂けてとてもびっくりしています。
一週間後にまたここのサイト見れば答えて頂けるかもしれないと思っていました。
やった事ないので適当なんだけど typedef char tag_aa[6]; tag_aa aa = *(tagaa*)"HALLO"; は不可?
285 :
デフォルトの名無しさん :2009/04/12(日) 21:23:28
287 :
デフォルトの名無しさん :2009/04/12(日) 22:00:25
>>284 すみません。やるといっておきながら
>>284 さんの言っていることがよくわかりません。
本当に申し訳ありません。
答えてくださった方達にはとても感謝しています。
ありがとうございました。
>>287 あまり2chに慣れていないようだから言っておきましょう。
別にこのスレの事を言いたい訳じゃないけど・・・
あくまで2chは2chです。
嘘ついてくる意地の悪いやつも多い情報危険地帯です。
信じるか信じないかはあなた次第です。
>>288 そんなこと書いたら、お前自身もなかなか意地悪なレスに思えてくるぞw
2ちゃんに慣れるってどういうこと?そもそも2ちゃんねるって 確かにこの世の全員が閲覧、書き込みをしているわけでもなく 最近では企業や関係者が一般人に紛れ込んでいることもあるが この世が自分中心に回っていると勘違いしているのか、主観で 他社を否定する基地外が増えている。お前こそこの世の一人に過ぎないと 気づくべき。たとえ大企業の社員でも。GKとか朝日とか思い上がりすぎ。 基地外社員は不祥事がバレて懲戒免職w
さてと今日も不況かどーか、仕事は一日分この時間で終わって しまった。時間つぶしにscanf(不毛)論争に油を注ぐとするか... 個人的にはscanf,printf系は消極的に使いたい派 純正UNIX育ちならば積極派だったんだろうな DOSでCを覚えた世代は消極系だと思う。消極的である理由は ライブラリの規格に過ぎないこと。つまりライブラリが統一 出来ない環境ではトラブルの種。出力利用の場合は文字列と して得られるのでまだ調整可能であるかもしれんが、 入力系利用の場合は問題がすぐに発覚しない場合もあり得て その時は怖いから。だから文字列として受け取って頭から 一文字ずつ読んで解釈していくコードを書きたいと本能的 に思う
unix系でもふつーに使ってない。
scanf()つかうなってのはすごい昔からDOS以外のコミュニティーでも言われてたんで、 DOSどうこうとか、規格が統一されてないからとかって考察は外れてるだろうな。
スキャンティのほうが好きです。
double d,dd; char s[256]; sprintf(s,"%lf",d); sscanf(s,"%lf",&dd); としてd==ddが保証されると思ってる?
誰にきいてる?
壁と話してるんだろ そっとしておこう
>>295 そんなことより
sprintf(s,"%lf",d);
は
sprintf(s,"%f",d);
でいいよ
>>298 間違える人が多いのでどちらでもよくなったんだよ
scanf_s
printfにも%lf使え!って暴れて大恥かいたバカもいたな、そういや。
今はfの前にl付けても無視されるけど DOSの頃はlfでdouble指定だったようだ じゃあなぜfloatとdoubleの指定を分けなくていいのかというと floatはスタックに積む際doubleに変換されるからである
お前の言ってるDOSってなんのこと?
もしかしてKABちゃんが昔所属してた・・・!!
PC-98引っ張り出してきてQuickC Ver.2.0をインストールして試してみた ヘルプにはlはdouble型を指定とか書いてるが嘘だった float f = 1.0; double d = 1.0; printf("%f %lf\n", f, d); printf("%f %lf\n", d, f); 出力結果は同じだった そりゃ明示的にfloatを宣言しない限りdoubleに変換されるもんな
いいえ、明示的にfloatにキャストしたとしても、スタックにはdoubleで積まれます。
プロトタイプ宣言で引数の型をfloatと指定しない限りfloatはdoubleで積まれる printfの第2引数以降、floatはdoubleとして積まれる(大昔から) つまりprintfで%lfを指定するのは間違い エラーにはならないがコンパイラによっては指摘するものもあるみたい
309 :
288 :2009/04/13(月) 22:59:48
>>289 もちろんメタ的な意味を込めて言ってみてます。
>>290 ごめんよ、
君にはメタ視点は難しすぎたか。
今度から君のような低脳にも分かるように
書くようにつとめるのでご勘弁を。
メタだからって何か意味があるのか。 メタへのレスも「メタ的な意味」だから。
まあ、C99でprintf系にlfを認めたことは、規格のほうが屈した形であると言えるだろうな。
よし、メタの目眩く世界に旅立とうぜ
格上げされることを知っていればどうということはないんだけど 非対称なのが気持ち悪いのも事実
片や値渡し、片や参照渡しなんで非対称になるのは止むを得ない scanf("%f", &dbl)とかうっかりやってしまうことも稀によくある
対称かのごとく説明するくだらない入門書が多いのも事実。 だから、printf()には"%g"を使う方がいいんだよ。
fはfloatだけどgは何だろう
gはeとf表示のうち表示精度が高い方を自動的に選択
eはexponentialだけどgは何だろう
gはfと同様の形式のときにも小数点以下の0はサプレスしてくれる。
サプレスってなに?
サプレス 【suppress】 抑圧。抑制。禁止。
G13型トラクター求む
324 :
taguti :2009/04/14(火) 16:10:58
6個のreal型変数x1、y1、x2、y2、x3、y3を定義しそれぞれに実数つを読み込んで、xy平面上の3点 (x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。 ・公式:底辺x高さ÷2を使って計算してください。 お願いします!!
すいませんスレ間違えました
>>324-325 間違えましたじゃねーよ
そう言うのは意図的なマルチポストって言うんだろ。
帰れ。うざいから。
328 :
デフォルトの名無しさん :2009/04/14(火) 23:32:52
>>326-327 てなことを、10スレ以上で言って回ってるのかおまえらは? おヒマですね
マルチポストがどーたらを言ってる奴自身、ろくな回答してねえのが多いんだよな
# 加えてクロスポストを知らなかったりするし
マルチにろくな回答をしてあげる必要があるのかとか、この件で クロスポストがなんの関係があるのかとかいろいろ疑問のわく書き込みだな。
>>328 いんやこれはマルチポスト
しかもIDも無い板で”奴自信”とかイッちゃうアンタはe視野狭窄の発症者
だれも相手に出来ない
331 :
デフォルトの名無しさん :2009/04/15(水) 00:58:12
実行結果を正しく予測できますか? #include <stdio.h> int main(void) { > int n = 0, *p; > p = &n; > fprintf(stdout, "n, p = %d, %p\n", n, p); > (*p)++; > fprintf(stdout, "n, p = %d, %p\n", n, p); > ++*p; > fprintf(stdout, "n, p = %d, %p\n", n, p); > *p++; > fprintf(stdout, "n, p = %d, %p\n", n, p); > return 0; }
>331 未定義動作が含まれているぞ
'>'のせいでコンパイルが通らない
334 :
331 :2009/04/15(水) 02:02:58
/* 再挑戦 実行結果を正しく予測できますか? */ #include <stdio.h> int main(void) { int n = 0, *p; p = &n; fprintf(stdout, "n, p = %d, %p\n", n, p); (*p)++; fprintf(stdout, "n, p = %d, %p\n", n, p); ++*p; fprintf(stdout, "n, p = %d, %p\n", n, p); *p++; fprintf(stdout, "n, p = %d, %p\n", n, p); return 0; }
どっちにしろ副作用完了点前に同じオブジェクトに代入と参照を行ってる気がするので 実行結果は鼻から悪魔が出るなりなんなりOK
気の所為だね。
339 :
デフォルトの名無しさん :2009/04/15(水) 09:26:02
*p++; の評価について勉強になった。 あんがと
グローバル変数をいっぱい作れば、ポインタ使わなくて済みますか?
>>340 小さいプログラムならいいかもしれないけどシステム固有のAPIとか
使うようになった際ポインタわからなければアドレス渡しとかでてきたら
どうするの?
そういうAPIが使える程には成長しないので大丈夫
>>340 ポインタを使うときは、使うなりの理由がある。
別にグローバル変数をいっぱい作っても仕様によっては
ポインタを使う可能性が出てくるかもしれない。
シングルトンだろ
345 :
デフォルトの名無しさん :2009/04/15(水) 21:05:22
warning LNK4099: PDB 'vc90.pdb' が '.\libjpeg.lib' で、または〜 となります。ぐぐりましたが、大概は無視してOKとかいてあるんですが 根本的な原因がわかりません。どうしたらこの警告がでなくなりますか?
ライブラリをコンパイルするときにpdbを出力しなければよかったような もしくはlibだけじゃなくてpdbファイルも一緒にコピーすればおk 「pdb 設定」あたりでググってみれば参考になるかも
.txtファイルに書いてある数字を入力として配列に格納するにはどーすればいいのか 分からん
348 :
デフォルトの名無しさん :2009/04/16(木) 22:27:50
fopen と fscanf
#include <stdio.h> int main() { int tbl[100]; int i; FILE* fp = fopen("a.txt", "r"); i = 0; while (fscanf("%d", &tbl[i++]) != EOF) ; return 0; }
すいません。
ttp://xn--n9q36mh1hnxuksz7wt.jp/FE16b-pm/t06.html の「プログラム」部分で、
if ( replaceChar( □□□ ) ) {
なんたらかんたら〜
}
って部分があるじゃないですか。
この□□□には " *input "が入るらしいんですが、
なぜこうなるのかイマイチよくわからないのです。
この "*input "の内容によっては 0 か 1 が帰ってくるみたいなんですが、
このifってのは( )の中の内容が当たっているか当たってないかだけでなくて
0か1でもいいってことなんでしょうか?
if( expression ) statement1 [else statement2] expression が真 (0 以外) であると、if キーワードによって statement1 が実行されます。 else があり、expression が偽 (0) であると、statement2 が実行されます。 statement1 または statement2 の実行後は、制御が次のステートメントに移ります。
>>352 ifの内容が0だと内容が偽と同じだってことですか。
ありがとうございました。
>>350 >349の条件判断は、 != EOFではなく== 1にすべきだな。
355 :
デフォルトの名無しさん :2009/04/17(金) 22:18:13
目に付いたところだけ書いたんだが。 あー、fopen()の戻り値はチェックすべきだし、fclose()位してもばちは当たらんね。
そんな細かいこと言うなら == 1もダメだろ。
>>358 オープンはエラーチェック必要でリードは必要なし?
>>359 4ビット抽出した後、chars配列を参照するので文字になる。
>>359 パッと見でなんですが、
! -> 0x21 -> 0x32,0x31 ではないかな。
>>362 あ、なるほど。
0x21の場合 0011 0001 → 0000 0011で、10の位にあったものが一の位になり、
chars[ 0011 (つまりは2)] = 2 で表されるってことですか。
どうもありがとうございました。
なんだ、答え載ってるじゃん。
367 :
デフォルトの名無しさん :2009/04/17(金) 23:21:57
スレに書いてあること8割分からないレベルなんだが最初は何から入ればいいか教えてくれないか
369 :
デフォルトの名無しさん :2009/04/17(金) 23:33:49
だめだググっても意味が分からない
372 :
371 :2009/04/17(金) 23:51:15
すいません。問題よく読んでいませんでした。
373 :
デフォルトの名無しさん :2009/04/18(土) 00:44:01
教えてください operation on 'hoge' may be undefined というワーニングがでて hoge=(++hoge)%3; 問題の箇所はという処理になってます。 元はVC++でコンパイルしてたものをgcc上でコンパイルしています どう対処すればいいでしょうか?
>>374 hoge = (hoge + 1) % 3;でいいと思う。
>>374 hoge=(hoge+1)%3;
にするとか。
>>374 hoge=(hoge + 1) %3;
おまえのやってることは未定義動作だからおこられてる
378 :
374 :2009/04/18(土) 00:49:51
てst
ワーニング(笑)
381 :
374 :2009/04/18(土) 06:48:48
ワーニングでもいいんじゃない なんかこれも読み方でひと悶着ありそうだな
>>381 プログラムを書く人って、変に細かいことにこだわる人が多いからね。
細かけぇ事はいいんだよ
errorはエラーだけどwarningは警告って言う人が多いイメージ
>>386 警告かあ。ウォーニングってくるのかとオモタ。
StarWars スターワーズ
MicrosoftWord マイクロソフトウォード
その程度を許容できないからキモイ認定されるんだろうな
スィー言語
iterator
イテラトール
スペイン訛りっぽいな。
ローマ人なら分かってくれる
質問です。 授業でteratermを使って、emacsでプログラミングをしているのですが とりあえず、先生の用意したプログラムをコピペして起動してみろとのことで 普通にコピペして、コンパイルしようとしたのですが 警告: null 文字は無視されました という文章が何十行にも渡ってでて、コンパイルできません。 調べてもなかなか対処がわからず、過去ログでの質問は自己解決していたりでわかりません。 断片的な情報から、文字コードの問題かと設定をUFT-8からEUCなどに変えてみましたが UFT-8以外では文字化けしてしまいます。 とりあえず、インデントをしっかりTabに書き換えたりもしましたが、解決しませんでした。 どなたか、解決法を教えてください。
C言語の問題じゃないから先生に聞け。そうでないならLinux板にでも逝け。
>>397 ありがとうございました。
やっぱりCじゃ無かったですか・・・。
環境依存可のC/C++スレに池
とりあえずemacsは糞だからviを使え
また論争の種を…
aファイルとlibファイルの具体的な差異を教えていただけますか? バイナリ見るとヘッダー情報も同じように見えるのですが…
libは知らんが、.aなら単なるarというアーカイバーのアーカイブファイルだ。 例えば、tar cf foo.tar *.oするのと本質的に変わらない。 tar tvf foo.tarするのと同様にar tvf foo.aできる。
>>402 .aがLinux用で.libがWindows用
知らんけど
C言語で実用的なアプリってもう書かれる事はないの?
>>405 Winアプリって意味なら最近は殆ど無い。
流石にこんな古臭いのでWinアプリは書いてられない。
まあせめてC++だなあ でも.netもじわじわと進出してるからc#とかで書かれてるのも結構あるし まあVBのおかげもあるんだろうけど
int a[3][3]={{1,2,3}{2,5,3,}{3,2,7}} と定義したaの値の中から、bとcの値をキーボードから入力して、 例えば、bが3でcも3なら7といったような結果を出すには どうすればいいのか教えてください。
>>409 ごめん日本語が意味不明なのは俺だけじゃないはず。
>aの値の中から、bとcの値をキーボードから入力して、
???
>>409 こういう事かな?
printf("%d\n", a[b-1][c-1]);
printf("%d\n", a[b - 1][c - 1]);
ヒントを言うとこれだ printf("%d",a[foo][bar]);
すみません…。初心者なので説明するのが難しいです。 えっと、3×3の表があって、縦の一列目、横の二列目という風に それぞれ1から3までの数字をキーボードから入力するということです。 3×3の表をa、縦をb、横をcとしてしまいました…。
そうかそうか0から始まるな
416 :
410 :2009/04/22(水) 22:35:48
お前らesper何級持ち? すげーな これだけesperがいればもう大丈夫だな。後はまかせた。
すみませんもう一ついいですか? int b,c; これって初期化したことになりませんか?
なりません。
初期化っつーか宣言だなそれは
ならないですね あくまで確保しただけ int b = 0; int c = 0; とか書いたら初期化
C言語難しいですね…。 きちんと縦の一列目、横の二列目にある数字が最後にでてきません…。
C言語の前に日本語勉強しなさい
申し訳ない。 国語は得意だったんですが。
これなんですが…。 %dのところに変な数字がでてきてしまいます。 scanfのところが間違っているのでしょうか。 int a[3][3]={{7,5,8},{6,5,7},{9,6,6}}; int b=0,c=0; printf("好きな番号を入力してください。\n",b); scanf("%d",&b); printf("好きな番号を入力してください。\n",c); scanf("%d",&c); printf("\n表の文字は、%dです。\n",a[b-1][c-1]);
printfの第二引数いらないよね
,bのところですか? これ、つけなくてもよかったんですね。
static int b,c; なら初期化
staticですか。まだ習っていないのでよくわかりませんが今度から 初期化はstaticを使わせてもらいます! 適当にちょこちょこ直してたらなぜかきちんとできました! いまいちどこがだめだったのかはわかりませんが…。 答えてくださった方々、ありがとうございました!
staticは静的変数だかんな
>>428 まてまてまて!
staticってなんだか分からないのに使うとたぶんとても困ったことになる。
頼むから適当な書籍で勉強してくれ。
staticなんて使わない方がいい 使うケースなんてレアだ
432 :
430 :2009/04/23(木) 00:12:37
>>431 > staticなんて使わない方がいい
> 使うケースなんてレアだ
俺は使いまくるけど・・・。
(C++だからか?staticメンバ関数とかとても便利。)
俺も使いまくり。ある関数が実行された最初の一回だけ特定の処理をしたいときとか。 void func(void) { static int flag; if(flag==0){ flag = 1; init_fuck(); } (処理) }
そのパターンだとコード中の毎回のif分岐とマシン語のstaticチェックがあまりにも邪魔くさい。 typedef void(*func)(void) = func_1st; void func_1st(void){ init_funk(); func=func_ord; func(); } void func_ord(void){ //処理 } だな
>>435 変数funcの初期値がfunc_1st()なので、初回のfunc()はfunc_1st()を呼ぶ。
そのfunc_1st()の中でfuncを書き換えておくから、二回目以降のfunc()はfunc_ord()を呼ぶ。
なるほど。天才ですね。
よく言われる。
お世辞も通じない馬鹿か
訳:うらやましいな
>>434 関数アドレスをコールの度にメモリ間接参照するのと
コールの度にフラグをメモリアクセスするのは、あまり変わらない
ブランチはブランチヒストリで予測されるだろうということで
もし頻繁に呼ばれる関数なら、分岐予測が分岐履歴から予測されるのでオーバーヘッドはほぼない。 もし頻繁に呼ばれない関数なら、分岐予測のオーバーヘッドとかどうでもいい。
443 :
デフォルトの名無しさん :2009/04/23(木) 14:49:51
はじめまして。 今C言語の勉強中で 構造体配列をソートしたいのですが どうしたらいいのかわかりません。 テキストに載ってるソート方法はみんなint型で 実際int型でソートしようとしても 要領の大きさが足らないとかでてきて… で、かわりにintのところをstructにしてもエラーになっちゃって… 私の実行したいことは 構造体の中のint型の数だけを判断してソートして出力させたいんです。 よろしくお願いします(>_<)
444 :
デフォルトの名無しさん :2009/04/23(木) 14:51:21
(>_<)←この顔文字使う奴は例外なく糞
エラーになったコードを貼るとどこを直せばいいのかアドバイスしやすい
ソートアルゴリズムの比較のところを構造体のintにして、 入れ替えのところを構造体の入れ替えにすればいいだけだろ。
448 :
デフォルトの名無しさん :2009/04/23(木) 16:28:36
//遅くなりました。分けて載せます// #include <stdio.h> #include <stdlib.h> #include <string.h> void swap(struct data *, struct data *); void printData(struct data *); main() { struct data{ int no; char food[12]; char eto[8]; char aisatsu[16]; }; struct data e[5] ={ {1, "すし", "ねずみ", "おはよう"}, {3, "たまごやき", "とら", "こんばんは"}, {4, "ステーキ", "うさぎ", "おかえりなさい"}, {5, "秋刀魚", "たつ", "おやすみなさい"}, {2, "やきうどん", "うし", "こんにちは"} };
449 :
デフォルトの名無しさん :2009/04/23(木) 16:31:37
int i; int j, k; int n = 5; struct data swap; for(i = 0; i < 5; i++){ printf("%2d %12s %8s %16s \n",e[i].no, e[i].food, e[i].eto, e[i].aisatsu); printf("------------------------------------------\n"); } for(j = 0; j < n-2; j++);{ for(i = j+1; i < n-1; i++);{ if(e[j].no > e[i].no){ swap("e+i, e+j"); } } } printData(e); }
450 :
デフォルトの名無しさん :2009/04/23(木) 16:35:04
void swap(struct data *y, struct data *z) { int t; t = *y; *y = *z; *z = t; } void printData(struct data *e) { int i; for(i = 0; i < 5; i++) printf("%d",e[i]); printf("\n"); } //これで終わりです//
int t; じゃなくて struct data t だろ
452 :
デフォルトの名無しさん :2009/04/23(木) 16:49:40
それでもだめでした・・・
struct dataの定義を main()の外に出す。 struct data swap;を消す swap("e+i, e+j"); じゃなくてswap(e+i, e+j);
454 :
デフォルトの名無しさん :2009/04/23(木) 17:03:04
↑のとおりにしたらエラーが出なくなって 出力されました!!! だけど番号が昇順にならない…昇順にしたいんですけど 何が間違っているのでしょうか???
ソートのループがおかしい
ソートのループはまあ、やればわかるけど それよりもfor文の後ろのセミコロンだ、これに騙されて時間かかっちまったw
for(j = 0; j < n - 1; j++){ for(i = j+1; i < n; i++){ if(e[j].no > e[i].no){ swap(e+i, e+j); } } } こうだな
458 :
デフォルトの名無しさん :2009/04/23(木) 17:14:58
すいません、今いじってたら解決しました!!! ご迷惑をおかけしました ありがとうございました!!!
459 :
デフォルトの名無しさん :2009/04/23(木) 17:18:15
結局参考にはなりませんでしたが 本当にありがとうございました!!!!
全く参考にはなりませんでしたしここに来た甲斐も全くありませんでしたが 自己解決しました ありがとうございました!!
下らない成りすましの何が面白いんだか
(>_<)
園児が部屋の隅で会議して大人には理解できない論理で結論に達し 「そうだよねー!!」と合唱してる感じだ
さーて、全員あぼんするか。
>>463 園児が大人達の会話にまざれなくて、かまって欲しくて奇行に走ってるのほうがふさわしいだろw
【神】 深夜の公園で全裸になり「裸で何が悪い!」と叫び続けたアイドル 【横綱】 磐田市内の県立高に侵入、女子生徒のスク水着て脱糞 【大関】 女子高生の上履きを盗み、コンビニでコピーしたものを見て楽しむ 19〜71歳女性に一瞬で精液をかける18歳少年「早撃ちマック」 「セーラームーン」のコスプレで女性に近づき網タイツ越しに下半身を露出 改造した釣竿を使い、足掛け30年で500枚もの女性下着を盗み続けた 【関脇】 ブルマー持参で小学校侵入、「学校ではくと快感」 女性宅に侵入し何も盗らずPCのスクリーンセーバーをエロ画像に変えた男 京阪電鉄の特急電車内で男が幼虫200匹バラまく。「驚く女性客見たかった」 【破門】 10年以上に渡り女児パンツを履いては近隣の家に投げ込んでた男。 ストッキングと女児用パンツを組み合わせる独特の手法にこだわりを見せ、 取り調べに対しても悪びれることなく「女性の下着は密着感が気持ちいい。」という名言を吐き一気に番付を駆け登る。 しかし過去に殺人事件や巨額の横領事件を起こしていたことが発覚。 再逮捕され、「変態道から外れた外道」と非難され破門。 2008年9月27日、大阪拘置所にて自殺。 【外国人力士】 深夜にオムツだけを着て女性に「このへんにオムツ交換室はありませんか?」と尋ねる男(イギリス)
リストの先頭から検索するロジックがいたるところにあるんですが ほぼ定型なのでマクロ化しようと思ってるんですが下記のような 場合はどうすればいいでしょうか? HOGE* ptr = HOGELIST(); while(ptr) { 何かの処理 ptr = HOGELIST(); } マクロ化したいのは「何かの処理」の前後になります。 複数行かけるマクロで書いてみたのですが暴走してるようなので 本来のロジックのように展開されてないようです。 {}をマクロ内部できっちり閉じない場合は何かおまじない?をする必要があるんでしょうか?
>>467 マクロはすべて一行に収めないといけない
複数行になる場合は行末に \ を書けば
次の行は前の行の続きとして扱われる
でも、マクロに変更しても処理速度UP効果はほとんど無い
そんなことよりもアルゴリズムを見直したほうが有意義だ
>>468 処理速度の向上といよりは手間ですね
関数の引数をはしょってますがこの関数で複数管理してるリストのリードが
できるようになってまして、その手間を省くために作成しようとおもってます。
一応実際というか理想は
#define HOGE_MAE (a) {\
HOGE* ptr = HOGELIST(a);\
while(ptr)\
{\
}
#define HOGE_ATO (a) {\
ptr = HOGELIST(a);\
}\
}
という感じで定義しておいて
HOGE_MAE(A_LIST)
何かの処理
HOGE_ATO(A_LIST)
としてます。
補足 A_LISTもdefineで定数が設定されてます。 リスト識別子とでも言えばいいんでしょうか
>>469 引数付マクロにしたければ丸括弧の前にスペースをいれては駄目
>>471 すみません
ここに記述する際に手打ちでやったのでいれてしまいましたが
実際は入ってません
>>472 中括弧の位置を間違ってるんじゃないの?
「手打ちだから間違えたけど実際は入ってない」とか
エスパーじゃないからわかんね
マクロでできるのは間違いないとしかいえないな
同じような処理を何度も書くよりはマクロにした方がいいね
マクロを関数のように使うのはよくないとコードコンプリート様は言っておられる。
何でそこまでしてマクロにしたいのか判らんが、可読性は確実に落ちるね。 それに、マクロの使い方を間違えたら泣けないバグが発生しそうだ。
>>469 それをやるんだったら、「何かの処理」を関数化して、
リスト検索の関数の引数として渡したほうがいい。
C言語のソースを文字列として処理するプログラムで 「*」(アスタリスク)が出てきた時にそれが 乗算演算子か間接参照演算子かポインタ変数宣言の記号かを判別する手順を教えてください。
>>478 状況設定がなさ過ぎで無理な気がするけど。
誰かエスパー頼む。
事前に型情報がわかってないと無理じゃないかな int* a; int INT; int b; INT* c;
ちがった int* a; int INT; int b; INT* b;
>>478 本気でやるなら、コメントやリテラル内での出現の場合も考慮する必要があるから
コンパイラ並のトークン解析処理を実装することになる。
そこは簡単
484 :
デフォルトの名無しさん :2009/04/24(金) 16:33:45
質問よろしいですか? リンクリストについて今勉強中なんですけど リンクリストのことを簡単に言うとどんな役割なんですか? 頭弱いんでほんとに簡単にお願いします。 どのテキスト読んでもよくわかんなくて… よろしくお願いします。
頭(あたま)悪(わる)いのはよくわかったから、先(さき)に日本語(にほんご)の勉強(べんきょう)をしてくれ
486 :
デフォルトの名無しさん :2009/04/24(金) 16:54:54
■質問です■ ひとつの関数内に2つ以上のreturn文があるのはよくないですか? もしそうならその理由もお教えください。 自分としては問題ないと考えてますが・・・
>>486 良いだろ別に、その人が制御出来ていれば。
変にフラグ変数とかgotoとかを乱発されるよか、returnが複数ある方がよっぽど良いと思うがね。
>>487 ありがとう。もっともですよね?
gotoで関数のケツにある一括エラー処理に落とすのも無問題ですよね?
質問してよろしいでしょうか。 Numerical Recipesを使って数値計算(runge kutta)のプログラムを組んだのですが、コンパイルは通ってもexeファイルが動きません。 どこかおかしいところがないか見ていただけないでしょうか。 #include <stdio.h> #include <stddef.h> #include <stdlib.h> #define NRANSI #include "nrutil.h" #define N 2 #define dist 0.01 #define M 100 void derivs(float x,float y[],float dydx[]) { dydx[1] = y[1]; } void main(void) { double t; float y[N],dydx[N],x=1.0,yout[N]; int j,i; derivs(x,y,dydx); scanf("%f",&y[1]); for(j=0;j*dist<M;j++){ t=j*dist; rk4(y,dydx,1,x,t,yout,derivs); printf("%f\n",yout[1]); } }
>>490 Numerical Recipesのインクルードファイルです。分割コンパイルしてあるのでわかりづらくてすみません。
もうひとつのファイルを貼り付けているので少しお待ちいただければと思います。
一緒にコンパイルしたものです。 #define NRANSI #include "nrutil.h" void rk4(float y[], float dydx[], int n, float x, float h, float yout[], void (*derivs)(float, float [], float [])) { int i; float xh,hh,h6,*dym,*dyt,*yt; dym=vector(1,n); dyt=vector(1,n); yt=vector(1,n); hh=h*0.5; h6=h/6.0; xh=x+hh; for (i=1;i<=n;i++) yt[i]=y[i]+hh*dydx[i]; (*derivs)(xh,yt,dyt); for (i=1;i<=n;i++) yt[i]=y[i]+hh*dyt[i]; (*derivs)(xh,yt,dym); for (i=1;i<=n;i++) { yt[i]=y[i]+h*dym[i]; dym[i] += dyt[i]; } (*derivs)(x+h,yt,dyt); for (i=1;i<=n;i++) yout[i]=y[i]+h6*(dydx[i]+dyt[i]+2.0*dym[i]); free_vector(yt,1,n); free_vector(dyt,1,n); free_vector(dym,1,n); } #undef NRANSI nrutil.hはこちらのプログラム中にある、〜vectorを定義しています。中身は単純に配列取ってるだけだと思います。
>>492 やはりライブラリの利用法になるのでしょうか・・・。
解説書を見てもやっている数式の説明ばかりで具体的な使用法が載っておらず困っていたのです。
アドバイスありがとうございました。
あと、スレ違いでしたら申し訳ありません。
>>494 「exeファイルが動きません。 」って何かエラーメッセージが出てない?
DLLや共有ライブラリにパスが通ってないとかでは
とあるプログラムの速度を向上させるためにCPUの仕様上doubleをfloatに変えると 有効ということになり変換作業していたのですが特定の箇所でフリーズするため 調査したところ0で割っていたことがわかりました。 doubleのときは問題なかったのですがfloatにしたことで起きるというのは やはり桁の問題なのでしょうか? double = 0; は実は0.000000000000000・・・・1とかなんでしょうか?
497 :
496 :2009/04/25(土) 10:54:01
>double = 0; double HOGE = 0; とした際のHOGEの中は・・・ ですね失礼しました
>>496 0を入れたら0だよ。
誤差で0以外が入るってなさそう。
>>496 元(doubleのとき)からのバグか、変換作業中のミスじゃないの。
いずれにしても、生半可な知識でfloatにしても速くなるとは限らないけどね。
一つだけヒント。floatにすると、doubleへの暗黙の型変換が発生するかもしれない点に注意。
例えばfloat foo = bar + 0.1;なんて書くと、とっても遅い型変換が二回も発生してしまう。
500 :
496 :2009/04/25(土) 12:02:02
>>498 >>499 うーん・・・
ソース全体のdoubleをfloatに置換して問題が発生してるところの
変数だけdoubleにするとフリーズ無しで、floatにするとフリーズ
という不可解な・・・
物理演算のちょっとしたソースなんですが元はwindows上で動いてた物を
どちらかといえば組み込み系のCPUに持ってきてるんですがやはりdoubleの
ほうが計算速い構造なんですかね?
ゲームプログラマになる前に覚えて起きたい技術を読め
502 :
496 :2009/04/25(土) 12:17:34
>>500 doubleとfloatとどっちが速いかは環境による。
(PCでやるときは、サイズが問題になるとき意外はdoubleをつかっとけば
いいと思うけど)
実測するか確かな資料にあたるかしたほうがいい。
504 :
489 :2009/04/25(土) 12:46:28
>>495 遅レスですみませんorz
共有ライブラリborlandC++/Cはcw32.libとimport32.libを加えています。
これでいいのかどうかいまいち自信はもてませんが大丈夫だと思っています。
DLLについてはコンパイラが勝手にやってくれるものだと・・・。ちょっとググってきます。
505 :
489 :2009/04/25(土) 12:55:45
何度もすみません。よく考えたらmakefileをさらせばすむ話なのでは・・・。 runge4-2.exe:runge4-2.obj rk4.obj nrutil.obj ILINK32 /ap /w- /x /C runge4-2.obj rk4.obj nrutil.obj cw32.lib import32.lib runge4-2.obj:runge4-2.c bcc32 -c -w- -Od runge4-2.c rk4.obj:rk4.c bcc32 -c -w- -Od rk4.c nrutil.obj:nrutil.c bcc32 -c -w- -Od nrutil.c と、こんなかんじで作りました。DLLと共有ライブラリどちらも問題ないと思っています。
>>500 フリーズするのは組み込み系のCPUでの話?
それだと使っているコンパイラにも拠るのでなんとも判らん。
そもそも実数なら0割り算で一一フリーズしないから、その変数のサイズに依存したコードでもあるかもね。
いずれにしても、どうしても高速化したいならアセンブリ出力を読めるくらいの知識が欲しいところだ。
>>505 えーとですね、"exeが動きません"ていうのが何を指してるのか分からないのですよ
runge4-2.exe を実行すると、何もメッセージが出ずにプロンプトに戻るとか
エラーダイアログが出るとか。
そうじゃなくて、実行結果(printfの出力)が期待と違うというのなら、
>>492 のいうように言語・環境の問題じゃないので、専門家を召還するしかない
静的ハフマン符号ってのを見てるんですが 1バイトのデータごとに出現回数を見て、頻度の高いものから2進数の符号を 割りあてるようにしようと思っています。 置換後の符号をそれぞれ 0, 10, 110, 1110, 11110, 111110, 1111110, 11111110, 11111111 とすると1バイトでは上記の9通りのデータしか置換できませんが 残りのデータはどうするんでしょうか。
510 :
デフォルトの名無しさん :2009/04/25(土) 18:11:51
ハフマン符号の説明は糞ばかりだからな
9通りの内の一つを次の符号参照にしてそれを繰り返す。 byte* return_buf={次符号参照の記号,頻度最大の値,頻度最大の値-1,・・頻度最大-7の値,{入力の符号化},次符号参照の記号,頻度最大-8の値,・・頻度最大-15の値,{入力の符号化}次符号参照の記号,頻度最大-16の値,・・}; 殆どの場合酷いことになるが。
byteって何ですか? 組み込み型ですか?
企業というか社会に巣食う大人が都合よく使い捨てる労働力です
514 :
デフォルトの名無しさん :2009/04/26(日) 02:36:30
L'Arc〜en〜CielのVOCALです
516 :
489 :2009/04/26(日) 12:46:48
>>507 なるほど。肝心な部分が抜けていたようですみませんでした。
runge4-2.exeを実行するとscanfすら実行せずにエラーで強制終了します。
出力先を指定してもなにも返さない(値が入っていない)のでプログラム自体がまったく動いていないのだと思います。
エラー報告の詳細にはAppver:0.0.0.0 Modver:0.0.0.0 Offset:00001017と出ていました。
要領を得ない説明で申し訳ないです。これでどうでしょうか。
すみません、C#しかやったことのない初心者なんですが、 C言語はじめてみて、日付の演算がもの凄く面倒に感じました。 (1ヶ月先の日付等を取得する場合などに、 年越しでの年+1や閏年なんかはデフォルトでは判定してくれないようなので) みなさんはやはりラッパ書かれて対処されているのでしょうか?
A: そんなことが必要になったらCを使わない。 C#とかC++とかでいいじゃない。 というのはあんまりだけど、とりあえずmktimeはある程度考慮してくれたはず。
教えてください。 小学生の問題みながら作ってみたんですが、うまく作動しません。 もしかしたら根本的に間違えてるかもです。 指摘おねがいします。 main(){ int a,n,y,x; scanf("%d%d%d",&a,&n,&y); x=y-a*n; printf("%d\n",x); }
どう作動したらよくて、現状はどうなってるからダメなのか書け
小学生の問題はちょっと背伸びしすぎじゃないかい君
さすがもっとも小学生に近い男、言うことが違うなw
>>520 えと、X=Y-A×N
の計算をやらせたいのですが、なにも表示されません。エラーの表示もでません。
空白です。
つかってるのはめじろってやつです。
>.521 えっと、 A円のものをN個買いました。 Y円で支払いをしました。 おつりはX円になるか求めよ。 ってのを作ったつもりなんです。
>>525 といいますと・・・?
メモ帳で作成したのを、メジロで実行しております。
文字列やその他は間違えていませんか?
scanfの意味がわかってないのに使ってるのか?
xが全角の文字な気がするのは気のせいか?
エラーメッセージも書けないような奴を相手にするだけ無駄ってことだな。
小学生に厳しいですね
大丈夫、今時の小学生だってコピペくらいできる。
メジロってC言語インタプリタか ググったけどよく分からんかった
入れて見たがVista64だとうまく動かんな、、、VMWareのほうに入れてみるか
#define <stdio.h> int main(void) { ・ ・ ・ }
XPだと何とか動いた。
>>519 そのまま実行して、
14 5 1000(リターン)
で
930
と表示されたが
>>519 何も表示されないのがいやなら
printf("1個の値段を入力:");
scanf("%d", &a);
printf("個数を入力:");
scanf("%d", &n);
printf("所持金を入力:");
scanf("%d", &y);
とかしろ
537 :
デフォルトの名無しさん :2009/04/27(月) 19:48:23
すみません。どうも求められている答えがわかりません。 6桁の16進数で入力されたカラーをRGBに分解して表示するプログラムを作成しましょう。 int color, r, g, b; scanf("%6X", &color); r=[空欄] ([空欄]); g=[空欄] ([空欄]); b=[空欄] ([空欄]); printf("RGB(%d,%d,%d)\n", r, g, b); return 0;
r=RGB_GETRED( color ); g=RGB_GETGREEN( color ); b=RGB_GETBLUE( color ); RGB_GETRED(rgb) (((rgb) >> 16) & 0xff) RGB_GETGREEN(rgb) (((rgb) >> 8) & 0xff) RGB_GETBLUE(rgb) ((rgb) & 0xff)
>>537 俺なら
r = (color >> 16) & 0xFF;
g = (color >> 8) & 0xFF;
b = (color >> 0) & 0xFF;
にする
空欄にあってないがな
>>516 scanf()の前で死ぬというのは不可解だけど、
rk4()の5番目の引数が
>>489 と
>>493 で違っている。
いずれにせよ
>>489 のソースに rk4のプロトタイプ宣言を入れたほうがいい。
あと、
>>489 の scanf と derivs の呼び出しは順番が逆じゃないかね
これじゃ不定値を dydx[1] にコピーしちゃう。
542 :
デフォルトの名無しさん :2009/04/27(月) 22:26:04
下みたいな2つのコードを書いた場合 int a = INT_MAX; a += 1; unsigned int b = UINT_MAX; b += 1; aの方は0にならないというか未定義だと思うんだけど、 bの方も未定義になる? bは0になるんじゃないかと思ってるんだけど実は処理系依存とかだったりする?
すまん、上の例だとaが0になることなんて殆どないな。 まあこちらに関しては未定義だと思うからあんまり意味は無いけども。
544 :
ごすけ :2009/04/27(月) 22:30:40
教えてください。 /*引数n(<=1000)の入力に対して1~nの間の素数をすべて求めて、 コンソールに表示するプログラムを作成せよ。(ちなみに1は素数ではない)*/ を、for文を使ってお願いします。
>>542 符号付き整数がオーバーフローした場合は未定義動作だが、
符号なし整数が範囲外にでたときは、
(MAX+1)を何回か足したり引いたりして範囲内になるようにした値になることになってる。
>>544 だいたいそれぐらい出来なくて将来どうする気だ
働く先がないぞ。
549 :
デフォルトの名無しさん :2009/04/27(月) 22:36:53
550 :
ごすけ :2009/04/27(月) 22:41:37
初心者だったんで、教えてほしかったんです。 ググりました。引数は見つからなかったんです。 私の将来、これからなんで。 ご丁寧にありがとう。
>>545 レスありがとうございます。
一つよくわからないんですがこの場合は必ずある特定値になるんでしょうか?
それとも単に範囲内に収まるって事だけが決められていて、
0〜UINT_MAXの値ならどれでも取りうるってことでしょうか?
例えばintが32ビット長なら計算結果の下位の32ビットがbに入ってるとは限らないのでしょうか?
552 :
デフォルトの名無しさん :2009/04/27(月) 22:46:08
特定の値だろ。MAXと-1はかなり関係がある。MAXで1足したら0だろ。
553 :
デフォルトの名無しさん :2009/04/27(月) 22:47:11
2の補数、1の補数とかCPUの依存はあるかも知れないが、通常だと0のはずだ。試してないが。
>>551 unsigned intの取り得る値は(UINT_MAX+1)個しかないから、
ある範囲外の値に(UINT_MAX+1)の整数倍を足して得られる
範囲内の値はただ一つに定まる。
ただし、(UINT_MAX+1)が2の冪乗である保証はどこにもないので、
下位ビットにそのままなるとは限らない。
555 :
542 :2009/04/27(月) 22:57:01
なるほどよくわかりました。 上司からこれは未定義といわれてしまって納得がいかなかったので質問させていただきました。 >ただし、(UINT_MAX+1)が2の冪乗である保証はどこにもないので、 >下位ビットにそのままなるとは限らない。 たしかにこれはそうですね。 ただ今の環境だとUINT_MAX+1は2のべき乗なのでこれに関しては大丈夫そうです。
556 :
デフォルトの名無しさん :2009/04/27(月) 22:59:16
stringで、 str.find("hoge") == -1 という比較が出来る。 左辺は、unsignedだが。
>>556 それは厳密には環境依存なので、正しくはnposと比較すべきです。
559 :
489 :2009/04/27(月) 23:20:46
>>541 レスありがとうございます。
たしかにプロトタイプ宣言が抜けていました。基本的なミスとはorz
関数宣言での変数は関数の型宣言だけで中身は何でもいいのかと思っていました。こちらも改善します。
また、derivesの値もたしかに不定のままになっていました。
なぜかまだ動かないままなのでなんともいえませんが、プログラムがかなり改善できたと感じます。
ご助言ありがとうございました。
ツェー言語
>>345 エスパーで
ファイルの先頭に
#pragma comment(lib,"libjpeg.lib")
を置いてみたら?
point[5]=
point[5]={10,50,20,40,30}という配列があります。 これを大きいものから順に並べてjyuni[5]の配列に入れたいと思っています。 jyuni[5]={50,40,30,20,10}となるように格納するのではなく、pointの何番目が一番大きいという形で格納したいのですが。 今回の場合で言うと、jyuni={1,3,4,2,0}となって欲しいのですが、このような処理はどうやったら良いでしょうか? わかりにくいかと思うのですが、よろしくお願いします
>>564 { {10,0},{50,1},{20,2},{40,3},{30,4}}
をソートして
{{50,1},{40,3},{30,4},{20,2},{10,0}}
とするとお望みのことが出来るのでは?
//ソート前 point[5]={10,50,20,40,30} ... //ソート関数中のスワップ部分 tmp = point[i]; point[i] = point[j]; point[j] = tmp; ... //ソート後 point[5]={50,40,30,20,10} ↓ //ソート前 point[5]={10,50,20,40,30} index[5]={0,1,2,3,4} ... //ソート関数中のスワップ部分 tmp = point[i]; point[i] = point[j]; point[j] = tmp; tmp = index[i]; index[i] = index[j]; index[j] = tmp; ... //ソート後 point[5]={50,40,30,20,10} index[5]={1,3,4,2,0}
>>566 pointの中身は動かしたくないのですが・・・・できませんか?
pointをコピーした配列を用意してそっちをソートすれば
>>564 #include <stdio.h>
int main(void)
{
int i, j, point[5] = {10,50,20,40,30}, jyuni[5];
for(i=0; i<5; i++) {
for(j=i; j> 0; j--) {
if(point[i] < point[jyuni[j-1]]) break;
jyuni[j] = jyuni[j-1];
}
jyuni[j] = i;
}
for(i=0; i<5; i++) printf("%d ", jyuni[i]);
return 0;
}
ソートしてみたり #include <stdio.h> int main(void) { int i, j, point[5] = { 10, 50, 20, 40, 30}, jyuni[5] = { 0, 1, 2, 3, 4}; for(i=4; i> 0; i--) { for(j=0; j<i; j++) { if(point[jyuni[j]] < point[jyuni[j+1]]) { int temp = jyuni[j]; jyuni[j] = jyuni[j+1]; jyuni[j+1] = temp; }}} for(i=0; i<5; i++) printf("%d ", jyuni[i]); return 0; }
かた〜いw
572 :
デフォルトの名無しさん :2009/04/29(水) 05:09:47
おまえらqsortを使え #include <stdlib.h> int point[5] = {10, 50, 20, 40, 30}; int jyuni[5] = { 0, 1, 2, 3, 4}; int cmp(const void *s1,const void *s2) { int *p1 = (int *)s1; int *p2 = (int *)s2; if(point[*p1] == point[*p2])return 0; else if(point[*p1] < point[*p2])return 1; else return (-1); } main() { qsort(jyuni,5,sizeof(int),cmp); }
debtさん コントローラーの状態正しく取得するには ・ProcessMessage()もしくはRenewInput()を一定サイクルで呼び出す。 ・上記処理の後でGetJoypadInputState()もしくはGetInputState()でボタン別の情報を取得 としないとだめです。 ProcessMessage()の中でRenewInput()を呼び出していますので 下記部分を崩してなければ取得はできるはずなんですが・・・・ //ループで必ず行う3大処理 int ProcessLoop(){ if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す GetHitKeyStateAll_2();//現在のキー入力処理を行う return 0; } int main() if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 while(ProcessLoop()==0) {//メインループ
みすwww
>>567 pointの中身を動かしたくなければpointの配列へのポインタを
作ってそちらをソートすればよかろう
578 :
デフォルトの名無しさん :2009/04/29(水) 09:25:34
ソートするのはjyuniなんだからpointなんて最初からコピー作る必要がない と思うよ。
>>564 #include<stdio.h>
#include<stdlib.h>
int cmp(const void *x, const void *y)
{
int * const *a, * const *b;
a=x;
b=y;
if(**a>**b) return -1;
return **a<**b;
}
int main(void)
{
int point[5] = {10, 50, 20, 40, 30};
int *p_point[5], jyuni[5], i;
for(i=0;i<5;i++) p_point[i]=&point[i];
qsort(p_point, 5, sizeof(int*), cmp);
for(i=0;i<5;i++) jyuni[i]=p_point[i]-point;
for(i=0;i<5;i++) printf(" %d", jyuni[i]);
return 0;
}
>>572 int cmp(const void *s1,const void *s2)
{
return point[*(int *)s1] - point[*(int *)s2];
}
581 :
デフォルトの名無しさん :2009/04/29(水) 14:45:45
mallocで確保したメモリーは必ず""で埋められているものなのでしょうか?
不定な値が入っていることはないんでしょうか?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
str = malloc(8);
printf("'
http://pc12.2ch.net/test/read.cgi/tech/1238087817/l50 '", str);
return 0;
}
以上ソースをcompileして1万回実行してみたんですが、変な文字列が出力されることはありませんでした。
しかし、man malloc を読むと"The memory is not cleared"と書かれており、
環境によっては不定な値が出力されたりするのか心配です…
* 環境
コンパイラ: gcc-4.3.2 ($ gcc -Wall hoge.c -o hoge とcompileしました)
OS: Linux (Debian-Lenny)
>>581 たとえば、どこかでメモリ使ったあとfreeして
その場所がまたmallocで割り当てられたら?
583 :
581 :2009/04/29(水) 14:49:40
誤植が多くすみません。再投稿いたします。 --- mallocで確保したメモリーは必ずNULLで埋められているものなのでしょうか? 不定な値が入っていることはないんでしょうか? #include <stdio.h> #include <stdlib.h> int main() { char *str; str = malloc(8); printf("%s", str); return 0; } ※以下581に同
584 :
デフォルトの名無しさん :2009/04/29(水) 14:53:38
>>581 検証プログラムがワルワルだな。
もっとしっかり検証汁
>>583 確保したメモリが'\0'でクリアされている保証があるのはcalloc()のみ
malloc()はローカル変数と同じで不定値
>>583 たまたま埋まってる場合もあるけど、ほとんどは埋まってないはず。
mallocで確保したエリアはmemsetなどでクリアするのが普通です。
>>586 わざわざbcopy() するのですかねえ。
4.3BSD. この関数は廃止予定である (POSIX.1-2001 では過去の名残 (LEGACY) とされている)。 新しいプログラムでは memcpy() や memmove() を使用すべきである。 memcpy() や memmove() では、最初の 2 つの引数の順序が入れ替わっていることに注意すること。 POSIX.1-2008 では、 bcopy() の仕様が削除されている。
589 :
デフォルトの名無しさん :2009/04/29(水) 15:16:52
一発でエラーがでますた。 #include <stdio.h> #include <stdlib.h> #define TEST_SIZE 100000 main() { unsigned char *test; int i; test = (unsigned char *)malloc(TEST_SIZE); for(i = 0;i < TEST_SIZE;i++){ test[i] = i % 0x100; } free(test); test = (unsigned char *)malloc(TEST_SIZE); for(i = 0;i < TEST_SIZE;i++){ if(test[i]){ printf("%7d %2x\n",i,test[i]); } } }
>最初の 2 つの引数の順序が入れ替わっていること なんでこんな余計なことするんだろw
591 :
デフォルトの名無しさん :2009/04/29(水) 15:38:13
とりあえず calloc を使え
592 :
581 :2009/04/29(水) 15:43:27
>>589 私の環境でもコンパイルして実行してみたんですが、エラーとかセグメンテーションフォールトが
でませんでした…たまたまかな…… gccでワーニングでないように以下のソースで実行してみました。
#include <stdio.h>
#include <stdlib.h>
#define TEST_SIZE 100000
int main()
{
unsigned char *test;
int i;
test = (unsigned char *)malloc(TEST_SIZE);
for(i = 0;i < TEST_SIZE;i++){
test[i] = i % 0x100;
}
free(test);
test = (unsigned char *)malloc(TEST_SIZE);
for(i = 0;i < TEST_SIZE;i++){
if(test[i]){
printf("%7d %2x\n",i,test[i]);
}
}
return 0;
}
593 :
581 (1/2) :2009/04/29(水) 15:44:23
レスありがとう!やっぱり不定なんですね…参考になります。 実は今、標準出力から文字列を読み込んで処理させるようとしています。 読み込む文字列の長さに応じて1KBづつreallocで文字列格納領域を拡張しながら strncatで文字列をつなげようとしてるんですが、格納領域を最初にNULLで埋める 必要があるのかないのかどうか?迷っています。 realloc(NULL, n)はmalloc(n)と同等だと思うのですが、 reallocしてstrncatする前に、文字列格納領域の最初に'\0'を書き込んで置くべきでしょうか? mallocの結果が不定だとすると初期化が必要なのかな? 以下は、検証用に標準出力から文字列を読み込んでそのまま表示させるソースです。 文字列格納領域(str)に、最初に'\0'を書き込んでおかなくても今のところ問題はないのだけど、 場合によっては不定な値になって問題出てくるのかな? 標準入力からの入力をつなげるときって、みなさんどうされてますか?
594 :
581 (2/2) :2009/04/29(水) 15:45:29
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BLOCK 1024 int main(int argc, char *argv[]) { char buf[BLOCK + 1]; char *str = NULL; int n; int size_str = 1; /* str = malloc(1); */ ←この部分がいるのかいらないのか? /* *str = '\0'; */ while (1) { n = fread(buf ,1 , BLOCK, stdin); if (n == 0) { break; } else if (n < 0) { perror("fread"); return -1; } *(buf + n) = '\0'; size_str = size_str + n; str = realloc(str, size_str); strncat(str, buf, n); } printf("%s", str); free(str); return 0; }
realloc()もmalloc()と同じくもし領域を拡大した場合は その領域の値は不定値 要注意
596 :
581 :2009/04/29(水) 15:51:13
標準出力じゃなくて入力でした。何度も誤記申し訳ない… $ gcc -Wall test.c -o test $ echo 'hoge...fuga' | ./test hoge... ... ...fuga のように検証しています。パイプで渡したデータを処理するプログラムが書きたい…
strcatでつないでいくのであれば 最初の1バイト目に0を書き込んでおけばあとは何もいらんだろ。
低レベルな質問で申し訳ないですが メイン関数から受け取った文字列の領域の長さを求める方法を教えてください サブ関数の仮引数で(char* str)で受け取った場合とかsizeofでやると4の値が返ってきてしまいます
int len = 0; while(*str++) len++;
>>598 そりゃchar*であろうがポインタのサイズだからだよ
4バイトってことは32bitCPUかな?
strlenでいけると思うけど、関数を呼ぶ側がちゃんとstrlenが暴走しないような
文字列を送ってくれるならそれでいいけどそれ以外は長さをもらうとかしないと
検知はできないね
601 :
デフォルトの名無しさん :2009/04/29(水) 16:16:56
stringつかえよ。
>>600 ふむふむなるほどですね
でも例えばstr[10] = "abc";でstrlenを使うと3の値で返ってきてしまうんですよね
そうするとstrの変数の全領域の長さがわからなくなってしまう
サブ関数内でポインタ変数の指す領域の長さってどうやれば良いのかな?
やっぱり上位関数から長さも引数として与えなければいけないんですかね?
>>602 >上位関数から長さも引数として与えなければいけないんですかね?
その通りです
そういうのが保証されるのが望ましいならCは無理ですね
>>603 ありがとうございました!
大人しく引数を増やします
小手先でどうにかなるほどCの歴史は浅くないけど struct simple_str { int len; char *str; }; みたいなのを昔使ってたことはヒミツ いまじゃStringです
pascalの文字列だな
しかし直近のmallocの初期化といい、文字列といい マネージド開発から流れてきてるのがいるのかね? Cはぶっちゃけアセンブラにかぶせた皮程度だからほぼ自分で面倒見るしかないし なんらかの安全のためのソフトウェアスタックをかぶせるくらいなら後発の言語使えば いいだけだしなあ
いつの時代もC初心者はいるよ。 今ならそうだな、新入社員とか。
とはいえ、初期化の時に何がデフォルト初期化されて、 何がされないかは、言語ごとにいつも戸惑うことになるのも事実。
>>609 それは実行形式 PE とか elf を考えればおのずとわかるのでは
考えたくない事実
ちゃんと必要な値で初期化してればデフォルトなんて考える必要なし
しかしその非効率性すら惜しむのがC
変数の未初期化は、lintでも(最近の)Cコンパイラでも警告だすだろ malloc()で取った領域の初期化は、プロセスのメモリサイズ増えるし余計なお世話
バブルソートで質問。 for( i = 0 ; i < 10 ; i++ ){ for( j = 0 ; j < 10 ; j++ ){ if( a[i] > a[j] ){ //iとjの数値は同じなので比較。 temp = a[i]; //tempにa[i]を格納 a[i] = a[j]; //a[i]にa[j]を格納 a[j] = temp; //先ほど格納したa[i]をa[j]に格納 } } } これの1,2行目って同時に回してる訳じゃないよね? そうだったらi=0とj=0の時、if文での比較で「同じ配列の数字」が判定されるんだよね? i=1の時に、j=0と比べてるって事でいいんだよね? 初心者ですまんが、ここがどうしても分かりづらいから解説頼む。
616 :
デフォルトの名無しさん :2009/04/29(水) 18:18:23
良く似た話だけどc++でnewを使って領域を確保した時はどうなん? 0でメモリを初期化してるのかな?
してません。 クラスや構造体の場合はコンストラクタの振る舞いに依ります。
>>616 コンストラクタ、デストラクタを理解してください
単純ソートだな。 for( i = 0 ; i < 10 - 1 ; i++ ){ for( j = i + 1 ; j < 10 ; j++ ){ こうじゃないの?
621 :
デフォルトの名無しさん :2009/04/29(水) 18:31:39
int flg; do{ flg = 0; for( i = 0 ; i < 10 - 1 ; i++ ){ j = i + 1 if( a[i] > a[j] ){ //iとjの数値は同じなので比較。 temp = a[i]; //tempにa[i]を格納 a[i] = a[j]; //a[i]にa[j]を格納 a[j] = temp; //先ほど格納したa[i]をa[j]に格納 flg = 1; } } }while(!flg); いっそ こうだと思うよ
>>620 それだと降順になった。
結局
for( i = 0 ; i < 10 - 1 ; i++ ){
for( j = i ; j < 10 ; j++ ){
でiとjは同じ数字でループしているのか
iの方が1多い数字でループしているのか
どっち?
2重ループがまったく理解できてないと思われる。
ソートとかリストのような有名なアルゴリズムはぐぐってもでてくるだろ
まずはループの中でprintf("%d, %d\n", i, j);とかやってみそ
626 :
デフォルトの名無しさん :2009/04/29(水) 18:44:30
>>625 あーなるほど。
もの凄い分かりやすかったw
助かった、ありがとう
光沢液晶のディスプレイなんかでよくプログラミングなんかする気になるな
629 :
デフォルトの名無しさん :2009/04/30(木) 13:40:13
1 #include<stdio.h> 2 3 #define CONST_VAL 10.8 4 #define CONST_VAL2 (CONST_VAL*10) 5 #define CONST_STR "C Language" 6 7 int main(void){ 8 printf("CONST_VAL = %g\n",CONST_VAL); 9 printf("CONST_VAL2 = %g\n",CONST_VAL2); 10 printf("CONST_STR = %s\n",CONST_STR); 11 return 0; 12 } ~ /*実行結果*/ CONST_VAL = 10.8 CONST_VAL2 = 108 CONST_STR = C Language このとき10行目の%sを%gとすると、C Lanfuageのところが108と表示されます。 これはなぜなんでしょうか?ぼくの考えではでたらめな数字がでるか表示されない と思ったんですが・・・詳しい方教えてください。
鼻から悪魔がでてるから
環境は? たまたま、を除外するとなるとアセンブラ出力してみてるのが確実 うちはそうならんけどな
>>629 出鱈目な数字がでて、予想通りじゃないか。
633 :
デフォルトの名無しさん :2009/04/30(木) 14:02:35
>>631 コンピュータ初心者なので
環境といわれて何を答えたらいいかわかりません。すみません・・・
コンパイラーはgccです。
>>632 そうなんでしょうか?
数値からしてCONST_VAL2と何か関係があるような気がしてならないのですが・・・
634 :
デフォルトの名無しさん :2009/04/30(木) 14:04:19
まさかみなさんのパソコンでやるとでたらめな数字がでてくるということですか?
>>633 もしかすると関係しているかもしれないが、「未定義」とはそういうことも含めて出鱈目な動作になるってこと。
未定義動作なんだから、それでどうなるかを論じるのはナンセンス。 どうして108になるか知りたければ、-Sつけてコンパイルしろ
637 :
デフォルトの名無しさん :2009/04/30(木) 14:09:45
-S付けてもわかるとは限らん つかFP数を関数に渡すときはFPレジスタを使うという APIで、直前に設定した108が上書きされず残っていた ということだろう
639 :
デフォルトの名無しさん :2009/04/30(木) 14:13:14
>>630 未定義動作のことをいっていたのですね。
回答ありがとうございました。
640 :
デフォルトの名無しさん :2009/04/30(木) 14:15:14
>>638 回答ありがとうございます。
よくわからない単語がたくさんあるので調べます。
>>640 >638を調べて理解しようとしない方がいいよ。今の段階ではそこまで意識する必要はないから。
642 :
デフォルトの名無しさん :2009/04/30(木) 14:58:16
>>640 そうですね。
調べてもよくわかりませんでした。
初心者にはまだ早いようです。
久々にこのスレに来た。教えてやれよみんな。
スレタイ的には俺に聞けだぜ?
>>642 待て。
それが分からないとC言語プログラミングは諦めた方がいいくらいの大事な事項ですよ。
未定義undefinedの動作ってのはつまり何がおきるか定義されていないってことです。
未定義undefinedの動作になるようなソースコードをコンパイラに渡した場合、
コンパイラは好き勝手なコードを出力していいよとC言語の仕様書にあるという意味です。
例えばその実行ファイル(Winなら.exe)を実行した次の瞬間に
君のPCが爆発してもおかしくない(C言語の使用に反していない)ってことです。
これを表すのに鼻から悪魔がでるという表現を使うこともあります。
最近東京図書館開かないな・・・
>>643 「未定義」であることだけ判ればいいと思うよ。
少なくとも、>638にあるような「FP数」だとか「API」だとか、
言葉の使い方もいい加減だし理解するべきことでもない。
647 :
デフォルトの名無しさん :2009/04/30(木) 19:22:45
別に未定義でも処理系定義でも、初心者的には書いちゃダメなコード程度のもので、 その辺の言葉を覚えるのは入門レベルの話じゃないと思った。
648 :
643 :2009/04/30(木) 19:23:04
>>646 俺もほぼ君に同意。
まあ未定義であるということは、
うまく動くかもしれないしとんでもないバグになるかもしれないということは
肝に銘じておいて欲しい。
それがC言語を扱う者のマナーというか命綱。
>>646 FP=Floating Point
API = Application Interface
覚えて帰ってね
651 :
デフォルトの名無しさん :2009/04/30(木) 23:28:37
w
下敷きにつながらない
じゃあ何て言うの
引数の渡し方は呼び出し規約じゃないの stdcallとかfastcallとか
まあ確かにAPIも見た目は関数そのものだけどだからと言って関数をAPIとは言わないなあ 自分たちで作るコードが対外的に機能を提供する物であれば使ってもらうときに APIと呼ばれるかもしれないけどねえ でもAPIの場合はオプソでもなければブラックボックスだし
関数の行数を減らすためだけに一部の処理を別関数にすることに意味があるんだろうか
あまりに長い関数なら、機能で区切る意味はある
電卓プログラムを作ろう。というやつで、 /* hello.c */ #include<stdio.h> int main(void){ double a,b,tasi,hiki,wari,kake; scanf("%lf%lf",&a,&b); tasi=a+b; hiki=a-b; wari=a/b; kake=a*b; printf("計:%f\n",tasi); printf("差:%f\n",hiki); printf("積:%f\n",kake); if(b==0){ printf("0除算によるエラーです。。\n"); }else{ printf("商:%f\n",wari); } return 0; こいつを作りました。 bが0ときにメッセージを出すつもりだったのですが、 間違った答えが出るわけでもなく、反応がないだけです。 どこを直せば大丈夫ですか?
割る前にエラー判定しろ、0除算で落ちてるだけ
662 :
デフォルトの名無しさん :2009/05/01(金) 22:35:40
C言語を学ぼうと思って、はじめてのAPIって本を買ったのですが自分には敷居が高すぎるようです。 初心者にもわかりやすい本を教えて下さい。
>>661 できました。
ありがとうございました。
自分の手を動かさないと意味ない。
>>662 初心者にこんなこと言うのもなんだがスレ違いだな
C言語を学ぼうとしているのに何故APIの本を買ったのかがわからない
初心者がいきなりAPIはむりっぽ。
Amazonとかで検索しても「はじめてのAPI」なんて本無いなあ
俺も「はじめてのAPI」なんて本聞いたことないなあ 検索しても出てこないし
APIというのは何かに対するAPIだから、APIそのものというのはない。
なんのAPIなんだろうか?
>>662
APIというかライブラリの使い方を覚えるのは楽しいと思う まずはpcapとかcurlとか
すいません。 #include <stdio.h> main () { char *str[] = {"I","am","Tom"}; int i = 0; for( ; *str[i] == '\0'; i++) { printf("%s ",str[i]); } return 0; こういうプログラムを作りまして、一応ビルドは通ったんですけど上手くいかないんです。 どこがおかしいんでしょうか? よろしくお願いします。
for( ; *str[i] != '\0'; i++) {
>>673 それと
char *str[] = {"I","am","Tom", ""};
のように最後に空文字列を付ける('\0')
675 :
673 :2009/05/02(土) 20:55:07
/**/ #include <stdio.h> int main(void) { int fun,fin; printf("2つの整数を入力してください。\n"); scanf("%d",&fun); scanf("%d",&fin); if(fun>fin) { printf("%dより%dのほうが大きい値です。\n",fin,fun); } else if(fun<fin) { printf("%dより%dのほうが大きい値です。\n",fun,fin); } else { printf("2つの数は同じ値です。\n",); } return 0; } なぜかコンパイルできないんですが、 どこが間違ってるんでしょうか?
printf("2つの数は同じ値です。\n",); ,が余分
678 :
676 :2009/05/02(土) 22:27:14
>>677 ありがとうございます。
「やさしいC」の回答のコードなんですが、
本のほうが間違ってたのかな。
679 :
118 :2009/05/02(土) 22:30:49
>>677 ごめんなさいよく読んでなかったです。
解決しました。
>>679 118関係ないです。
ちょっとあわててしまったなあ、もう。
682 :
1/1 :2009/05/03(日) 04:11:09
初心者です。 まだ起きてる方いましたら教えてください。 以下のプログラムで足し算を行いたいです。 /*電卓風味の足し算だよ*/ #include<stdio.h> int main() { int a,b,c; scanf("%d",&a); scanf("%d",&b); c=a+b; printf("結果%d\n",c); return 0; } このプログラムを↓に変える
/*c=a+bの位置を変えたよ*/ #include<stdio.h> int main() { int a,b,c; c=a+b; scanf("%d",&a); scanf("%d",&b); printf("結果%d\n",c); return 0; } scanfはユーザー側が入力することが出来るものですよね。 文法では間違っていないと思うんですが何が問題でしょうか? 分割にしないと改行が多すぎとはねられてしまうため分けました。 見にくかったらすみません。
>>682 は数値を入力してから計算するからaとbの値を足した値がcに代入されるけど、
>>683 はaもbも値が定まっていない(不定値)の状態で足しているから、cは意味不明な値になる。
だから
>>683 のほうは値を入力しても意味が無い。
レスありがとうございます。 簡単にいうとプログラムは上から下に処理していく ↓ 「a+bの入力をユーザーから入力してもらう方が先」 ↓ だから「結果のc」を先に書いてもエラー ↓ になるってことですよね?
そう
ありがとうございました。 初心者すぎて呆れちゃいますよね。すみませんでした。
いやいや気にしなくていいよ。 半分寝た状態で書き込んじゃっただけだから。 これからもその調子で頑張っていけばいいよ。 じゃ、眠いから寝るわ
floatを含む構造体用のエリアをクリアする場合0x00で埋めるのは大丈夫でしょうか? intなどは問題ないと思うのですが
IEEE754の浮動小数点数なら、全ビット0で0を表すからOK。
>>689 わかってやる分にはOKかと
ポインタを含む構造体を memset で 0初期化したりとかもよくある。
C++のオブジェクトみたいに得体の知れないものは完全にダメ
unsigned char hoge; という1バイトの変数があります。 各ビットごとに比較を行うにはどうしたらいいですか? 3ビット目が0ならば・・・みたいな感じです
hoge & 0x01 hoge & 0x02 hoge & 0x04 hoge & 0x08 hoge & 0x10 hoge & 0x20 hoge & 0x40 hoge & 0x80 こんな感じ
for (i = 0; i < CHAR_BIT; ++i) { if ((hoge & (1<<i)) != 0) printf("bit %d is set\n", i); }
1<<i ていうのはforでiを変えてその数字分左シフトしてます つまり i =0の場合1を0シフトするので1ビット目の調査をします i =1の場合1を1シフトするので2ビット目の調査をします
なるほど! CHAR_BITってのは変数のビット数ですか?8ビット?
>>698 この場合は変数じゃなくてdefineでcharの最大ビット数である8が入ってると
考えるのが普通かと
自分を基準に普通とか言っても、そのレベル未満の相手には通じない
CHAR_BITは<limits.h>で定義されてる標準のマクロで charのビット数を表し、8以上の値であると決められている
702 :
693 :2009/05/03(日) 19:46:20
1ビット変数が2つあって、 その2つの変数の各桁が一致してるのが何桁目みたいに表示するにはどうしたらいいですか?
>>702 ごめんよくわからない
具体例を2,3個挙げて
for(i=0; i<8; i++) if(~(a ^ b) & 1 << i) printf("%d ", i);
>>702 1ビット変数じゃなくて1バイト変数だよな?
はい。そうでした・・・
>>704 わかりました。ありがとうございます
/**/ #include <stdio.h> int main(void) { int fun,i; printf("いくつ*を出力しますか?\n"); scanf("&d",&fun); for(i=1; i<=fun; i++) { printf("*"); } printf("\n"); return 0; } えーとですね、数字を入力した数だけ「*」を出力させたいんですが、 「*」が1つしかでてくれません。 どのようにすればいいんでしょうか?
&d -> %d
709 :
118 :2009/05/03(日) 23:29:23
>>709 118関係ないです・・・。
少し落ち着いたほうが良いな俺・・・。
Cでこれだけはやっておけってのある? printfやscanfは勿論で 構造体とかポインタ、配列… ぐらいしか思いつかない、他にやるべき事ある?
異なるコンパイラでもちゃんと動作確認できるくらいの努力はほしい
デバッガ使えるようになろう
viをマスターしよう
>>714 sscanf()は使ってるコードけっこうない?ifconfigとか…
やるとか、やらないとかじゃないだろう それとも関数一つ一つ勉強するのか?
いちいち煩い。scanfでも使えないものではないが、適切に使う必要があるため そこを理解して使え。scanfに限らず、その他のライブラリ、コードの書き方に於いても もうそういった点はプログラマー、ユーザが気をつける点だろ。 内部を破壊するようなプログラムなんて、いくらでも書こうと思えば書ける。
・scanf()は挙動に癖があってほかの入力関数にくらべても独特。 ・挙動に習熟しても、入門レベルを脱したら使わない。 ・他の関数で簡単に代替できる。 ・scanf()を使うテキストで勉強してる初心者は、サンプルを いじってちょっと複雑なコードを書こうとするとだいたいはまる。
そして俺はハマってjavaに逃げた そしたらハマった
改行コードが文字列に含まれてる。
同梱のxml.vcprojです。 同梱のvalid.htmlならうまくいくんですが。。。
l
>>724 || ch == 0x0D が抜けていたようです。
'\n'はLFなのか。。。ありがとうございました。
あんまりまじめに見るつもりないけど気になった点 ・strcmpで比べるデータの比べる開始位置が違う、お尻にゴミが付いてる ・strcmpで比べる前になんで表示しないの? ・改行コードのは0x0Dだけでいいの?0x0D+0x0Aセットもあるよ。バイナリエディタで見てみるとテキストといえど違うよ
>>727 ゴミが付いているという件ですが、どうやったら調べられるのかわかりません。
char* fgetarea(FILE* fp, fpos_t pos_set, fpos_t pos_end)で
p = malloc(len - 5);でも動いたので、文字列より多くmalloc()してるということでしょうか。
だとしたら何でかな。。。
表示については比べた後で表示してるのですが何がいけないのでしょうか。
改行は'\n'がLFならisAttributeが1になるので問題ないと思いました。
>>728 まずはstrcmpが比べてる長さがprintfなどで視認できる文字数とあってるか確認
おかしいなら文字にしてくれる便利な関数を使わないで文字コードを起こしてみてみる
まあおかしくなる原因は文字として割り当てのない制御コードあたりが付いてるとかそんな程度だろうし
改行コードが悪さしてゴミがついてたように見えただけでしょ?
>>729 例えばこういうことでしょうか?
void string_dump(char* string)
{
char* p = string;
while(*p != '\0') {
printf("%x ", *p);
p++;
}
printf("\n");
}
正しくないプログラムでやったら終端にd(CR)が来てわかりやすくなりました。
こういうやり方があったのですね。覚えておきます。
>>731 printf系は当然文字の割り当てがない制御コード(改行コード)とかは表示できないけど
文字の操作系は0x00以外は文字として処理しそうな感じだから当然見えない文字が
あってstrcmpは長さの違う文字を比較してることになることになるケースもある
じゃあなんでそんな切り方をするか・・・と考えていけばバグの原因もわかるかと
DXライブラリと言うのを使って、ちょっとしたゲームを作ってるんですが判定がうまくいきません。 1のキーが押された時(一回押されたら、その後もずっと)y01の動作を止めたいんですが、どうしても離したときにflagが1に戻ってしまいます 書き方が悪いのか、どうも処理に矛盾が出てしまう…。 int i; int flag = 0; timer++; //グローバルで0で初期化済み if( timer >= 50 ) flag = 1; if( CheckHitKey( KEY_INPUT_1 ) == 1 ) flag = 0; //1キーが押された時の処理 switch( flag ){ case 0: break; case 1: for( i = 0 ; i < DOWN_SPEED ; i++ ){ //定数は5 y01++; //グローバルで50で初期化済み } break; default: break; }
>>733 とりあえずそのソースだけ見るとtimerが増える一方だと思うんだが
1キーが押された時とかにtimerを初期化しなくていいのか?
>>733 そのコードは、ゲームループで毎フレーム実行されるんだろ?
"一回押されたら、その後もずっと" をするなら、グローバルか、static で結果を保持するしかないでしょ?
で整理すると、timer で50フレーム待って、それ以降はy01が毎フレームDOWN_SPEEDだけ増加すると
(お節介だが、マルチスレッドでy01を見てるとかじゃなければ y01 += DOWN_SPEED; じゃね?)
で、
>1のキーが押された時(一回押されたら、その後もずっと)y01の動作を止めたいんです
も、条件に入ると
static int flag_key = 0;
int i;
int flag = 0;
timer++; //グローバルで0で初期化済み
if( timer >= 50 ) flag = 1;
if( CheckHitKey( KEY_INPUT_1 ) == 1 ) flag_key = 1; //1キーが押された時の処理
if( flag == 1 && flag_key == 0 ) y01 += DOWN_SPEED;
こんな感じにエスパーして見たw
ああ… int i; は、もう要らないね
>>735 あーstatic使わないとダメだったのかぁ。
前に
>>735 と同じ処理書いたけど、つかってなかったから動作しなかったみたい。
助かった、ありがとう。
>>737 俺は全体の処理をしらないから static 使ったけど
ゲームの状態(再リセット等)での static 変数の再初期化とかもあるんじゃね?
普通に global 変数にして管理した方が良いよ
>>739 windowsで16bitって・・・・・・
>>740 いろいろ理不尽なお作法があって、32bit よりも大変でした。
>>741 知ってる
x86の16bitモードは使いにくい
コンソールは面倒だからデフォでラージモデルにしてたが Windowsは節約でミディアムモデルが多かったなあ
私はコンパクトモデルを愛用していました。どうせ64KBよりも大きなこーどはかかないし。 それにどうあがいても64KBの壁はこえられない。EMSのページも64KB単位でデータ管理しなくちゃいけないし。 いい訓練にはなりましたが。
745 :
739 :2009/05/06(水) 23:28:11
>>662 そうそう,
>>739 にしても C 言語の基本はマスターしておかないときついです。
適当な参考書で自習してくださいね。MS-DOS/コンソールアプリは自力で書ける/デバッグできるくらいの腕力は必要かと。
って 100 近くも昔のものにレスするのもどうですかね。
関数ポインタをコールバックで呼び出す場合はどういう風に記述すればいいんでしょうか?
>>746 たとえば、
int cmp(char *a, char *b) { return strcmp(a, b); }
qsort(base, n, sizeof(char *), (int (*)(void *, void *)cmp);
コールバックって結局、ある関数の引数に渡された関数のアドレスを使って関数呼び出しをするだけのことでしょ
>>747 ありがとうございます。
>>748 コールバックと関数ポインタのそれぞれ単独は使ったことがあるのでわかるんですが
それを両方一度にというのを今回やってみようと思ったのですが記述がよくわからなかったもので・・・・
ちなみに中はどのように処理すればいいんでしょうか?
イメージとしては 関数ポインタのポインタ->関数ポインタ->関数 となっててコールバック元へ関数ポインタのポインタを渡せばいいんでしょうけど Cでの記述がわかりませんorz
もとい >Cでの記述がわかりませんorz コールバックする側のCでの記述もよくわかりませんorz
あーごめんなさい 関数ポインターで配列の形を取ってるものをコールバックさせるでしたorz たびたびすみません
753 :
747 :2009/05/07(木) 00:31:36
>>751 標準関数のqsort()を調べてみてはいかがでしょう?
>>747 int (*)(char *, char *)をint (*)(void *, void *)にキャストすることはできない
int (*[])(void *, void *) これでいいのかな?
756 :
747 :2009/05/07(木) 00:39:43
>>754 違います。qsort() の第4引数 int (*comp)(const void *, ocnst void *) にキャストしているのです。
使ってみればわかります。
そもそも関数ポインタはいかなる異なる型にもキャストできないんだが。
>>746 void callee() {}
void caller(void (*pf)(void)) { pf(); }
int main() { caller(callee); return 0; }
759 :
747 :2009/05/07(木) 01:06:35
>>757 出典をお願い致します。長年こうやって使っていますし、手元の bcc, gcc で通るのですが。
俺はその件にはタッチしないが
>>747 のような、「関数ポインタをキャストするようなやり方」はセンスが無い、とは言い切れる。
int cmp(const void *p1, const void *p2) { return strcmp((char *p1), (char *p2)); }
のような、データのキャストだけで済むようにする方が
読みやすいしバグが混入する可能性も減らせる。
あ、Cなら、キャストなしでstrcmpにvoid*を渡せるんだっけかな。
もう一つだけ。 タッチしないとは言ったものの、 関数ポインタをデータポインタにキャストすることは安全ではない。 void*へのキャストを含めて。 関数ポインタ同士でのキャストについては、知らないから何もコメントできない。
そういう口はまともにキャストできるようになってからききましょうねw
765 :
747 :2009/05/07(木) 01:24:49
>>760 まあ、今はマクロ(templete) で生成的に書くやりかたが普通ですし。
でも qsort() のような使い方は、ちょっと前まではごくあたりまえだったと思うですが。そのための void * でしたし。
>>759 出典は規格票。キャストできるとはどこにも書いていない。
して良いと書かれていないキャストをした場合は未定義動作だから
コンパイルが通るなんてのは、なんの反論にもならない。
関数ポインタを別の関数ポインタにキャストすることはできないし、
関数ポインタを汎用ポインタにキャストすることもできない。
>>763 それはそうですね。昔は (void (*)())0 と (void *)0 が違った世界もありました。コンパクトモデルとか。
charへのポインタを2つ繋ぎ合わしてcharへのポインタを返す関数をつくろうとしたのだが、そもそも以下のコードでエラーとなりました。 何がいけないのでしょうか? #include <stdio.h> #include <string.h> int main() { char * ch1 = "こんにちは"; char * ch2 = "タナカくん"; printf("ch1 = %s\n", ch1); printf("ch2 = %s\n", ch2); strcat(ch1, ch2); printf("ch1+ch2 = %s\n", ch1); }
普通に考えてchar*とvoid*の大きさが違うときに死ぬんだから、移植性がないことくらいわかるだろ。
>>769 > char * ch1 = "こんにちは";
> char * ch2 = "タナカくん";
ここでconstが落ちてる。
const char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
と書きなさい。
そう書いたところで連結しちゃダメだろw
773 :
769 :2009/05/07(木) 01:38:26
>>771 const char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
とするとコンパイル時警告となり
char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
とするとランタイムエラーのままです
なんのためのconstだよw
775 :
769 :2009/05/07(木) 01:48:05
よくわからないので、char *を2つ引数にとってchar *を返す関数をお願いします char * function(char *x, char *y) {//<-ココ} char *z = function("こんにちは", "タナカくん");
こんばんわ。 今日もよろしくお願いします。 長いため分割で乗せますので解説お願いします(今、関数でつまずいています) /*今日も頑張るぞ!!*/ #include<stdio.h> double tasizan(double x,double y); double hikizan(double x,double y); double kakezan(double x,double y); double warizan(double x,double y); int main(void){ double a,b; scanf("%lf%lf",&a,&b); printf("足算:%f\n",tasizan(a,b)); printf("引算:%f\n",hikizan(a,b)); printf("乗算:%f\n",kakezan(a,b)); printf("割算:%f\n",warizan(a,b));
return 0; /*引数の足算*/ double tasizan(double x,double y){ double answer; answer=x+y; return answer; } /*引数の引算*/ double hikizan(double x,double y){ double answer; answer=x-y; return answer; } /*引数の乗算*/ double kakezan(double x,double y){ double answer; answer=x*y; return answer; }
/*引数の割算*/ double warizan(double x,double y){ double answer; if(y==0){ printf(エラーです\n); answer=0,0; }else{ answer=x/y; } return answer; }
以上が自分の書いたものですがエラーになりさっぱりわかりません。
>>779 文字列を""で囲まないとどんなエラーなのかわからないから答えようがない
>>780 さん
ごめんなさい。
printf("エラーです\n");←の""のことですか?
------ ビルド開始: プロジェクト: プログラムはこっちを使って練習, 構成: Debug Win32 ------ コンパイルしています... sample.c c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(12) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf' の宣言を確認してください。 c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(20) : error C2143: 構文エラー : ';' が '型' の前にありません。 c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'answer' : 定義されていない識別子です。 c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'x' : 定義されていない識別子です。 c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'y' : 定義されていない識別子です。 c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(23) : error C2065: 'answer' : 定義されていない識別子です。 ビルドログは "file://c:\Documents and Settings\mieko\My Documents\Visual Studio 2008\Projects\マイクロソフト プログラム練習\Debug\BuildLog.htm" に保存されました。 プログラムはこっちを使って練習 - エラー 5、警告 1 ↑何回見てもエラー部分のスペルや分法が間違っているようには見えないのですが・・・。
20行目でエラーだってんだから その行かその直前の行を穴のあくほど見直せ。 とりあえずmain()の最後に}が抜けてるのはコピペミスかもしれんが。
すいません。自己解決しました。 return 0;の後ろに{忘れてただけでした。 すみません。
>>783 時間差で教えてくれててありがとうございました。
女だからってちやほやされると思うなよ
>>770 まさか。だいたい、昔(K&R1) はこういうときには char * をつかっていましたよ。void * ができたのはその後のこと。
char * function(char *x, char *y) { char *p; p=(char *)malloc(strlen(x)+strlen(y)+1); strcpy(p,x); strcat(p,y); return p; }
>>787 ANSI準拠でない、という話をしているのに、なんでK&Rがでてくるんだ。
ANSI以前のK&Rには移植性のかけらもない。
ポインタのサイズが同じじゃないとmalloc( )使えないじゃん
ポインタのサイズは一緒でしょ むしろ今となっては型があってないとまずいのはアライメントの問題とかでしょ
>>790 void*からchar*に代入しようとすると、ポインタの(暗黙的)キャストが発生するが、
そのときに適切にポインタを変換してやればいい。
>>791 型がちがうとサイズもちがうってことはありえるよ。
ワードアドレス方式だとワードポインタとバイトポインタで大きさが違うことはよくある。 ANSI Cはそのような環境にも移植できるようになっている。
>>795 ポインタ≒メモリアドレスという理解しか出来ないからわかんないや
プリント配布されたプログラムを打ち込んでみたのですが、式の構文エラーが発生します void read_data(char *filename, double x[], double y[], int *n){ FILE *fp = fopen(filename, "rt"); int i; fscanf(fp,"%d",n); for(i=0;i<*n;i++) fscanf(fp, "%lf%lf", &x[i], %y[i]); fclose(fp); コンパイラによるとfscanfの部分にエラーがあるようですが プリントと見比べて違っているところがわかりません。 どこがおかしいか、教えていただけないでしょうか?
&x[i], %y[i] ここですね・・・見落としてました。自己解決です すみません
>>792 逆ではないかと。
void * -> char * は問題がなく(だから暗黙のキャストでOKなわけ)、むしろ char * -> void * で「本当にアラインメントを無視してもいいのか」という
警告が出ます。qsort() の第4引数では書き手がOKを明示するために、キャストが必要なわけです。
K&R の古からあたりまえに行われてきたことですから、ANSI標準でばっさり切られることはないと思うのですが。
>>789 というかK&R1のソースはきょうびのコンパイラではもう全然コンパイルできないのですか?(若干の修正は要るにしても)
関数ポインタをキャストするよりも、引き数をキャストするべき。 レガシーコードがansiでコンパイルできないのは最早常識。
>759 > 9899:1999 6.3.2.3/8 > A pointer to a function of one type may be converted to a pointer to > a function of another type and back again; the result shall compare > equal to the original pointer. If a converted pointer is used to call > a function whose type is not compatible with the pointed-to type, > the behavior is undefined. compatible type については分散してるので引用はパス。6.2.7 から辿ってくれ。 基本的には同じ型だと思っていいと思う。 >799 > 9899:1999 6.2.5/26 > A pointer to void shall have the same representation and alignment requirements as a > pointer to a character type. なので char* と void* のアラインメント要求、表現が同一であることは保証されている。
void*とchar*は交換可能。
K&Rからの名残だし今の規格でも認められてる。
関数ポインタのキャストをするのは危険。
>>800 のいうとおり。
要するに 古い遺物のようなソースを平気で書いちゃう おじちゃんプログラマはもはやもう要らないってことか。
>>803 でも、関数ポインタとかコールバックは適度に欲しい機能だから
付きまとう問題だと思うんだけどねえ
それにポインタサイズをころころ変えるコンパイラ?の方がまずい気がするんだが
そこまで詰めてどんだけメモリ節約する気なんだろとか思うわ
だから、関数ポインタを使うな、なんて誰一人言ってねーだろうよ。 関数ポインタをキャストするな、引数をキャストしろ、と皆言ってるんだろ。
質問です。 OSはubuntuをvm上で動かしています。シェルはbashで、gccでコンパイルしています。 ソースは以下です。K&R1-9の解答1そのまま(のはず)です(ただ質問内容は1-9の趣旨とは直接関係ない気も)。 #include <stdio.h> #define NONBLANK 'a' main() { int c, lastc; lastc = NONBLANK; while((c = getchar()) != EOF) { if (c != ' ') putchar(c); if (c == ' ') if (lastc != ' ') putchar(c); lastc = c; } } 1.上記を実行し「hoge」+Enterと打ち込むと次の行に「hoge」と出力されます。 これはEnterで標準入力が終わり、かつ一文字として出力されるので改行される、という認識であってますか? 2.何も入力せずにCtrl+Dだけ打ち込むとプログラムが終わります。 しかし「hoge」+(Ctrl+D)と打ち込むと、改行なしに「hoge」と出力されるだけでプログラムが終わりません。 なぜ終わらないのでしょうか? よろしくお願いします。
標準Cで定められていない事柄にかんしては、 好き勝手に(いかにクソにでも)して良いってのが 絶対的建前。 よって多くのコンパイラではこうだからうんぬんなんてのは役立たん。
>>806 1.OK
2.while((c = getchar()) != EOF)のgetcharが入力を待っているから。
EOFが返されていない。
809 :
デフォルトの名無しさん :2009/05/07(木) 22:39:55
SceUID mod; mod = LoadStartModule("lflash_fatfmt.prx"); if (mod < 0) { ErrorExit(6000, "Error %08X loading/starting lflash_fatfmt.prx\n", mod); } mod = LoadStartModule("ipl_update.prx"); if (mod < 0) { ErrorExit(6000, "Error %08X loading/starting ipl_update.prx\n", mod); } mod = LoadStartModule("libpsardumper.prx"); if (mod < 0) { ErrorExit(6000, "Error %08X loading/starting libpsardumper.prx.\n", mod); } } 何とかしてください。お願いします。
そのスレで聞けばいいのではないだろうか
812 :
806 :2009/05/07(木) 23:09:30
レスありがとうございます。
>>808 通常だとgetchar() でまず入力を待ち、
Enterで入力が終わったらループが一文字ずつ回り、
文字列がなくなるとまたgetchar() で入力待ちになるわけですよね?
しかし「hoge」+(Ctrl+D)を打ち込むと
ループの最後の一文字がEOFになるからプログラムが終了するかと思ったんですが。
>EOFが返されていない
というのは、EOFが標準入力の終わりになったときは、Enterとは違ってそのまま消えてしまうということでしょうか?
見当違いでしたらすみません。
>Ctrl-Dの本来の意味は行バッファ中の文字を送信するためのもの。 >行バッファが空の場合は、0文字が送信され、これがEOFと解釈される。 >だから行の途中でCtrl-Dを入力してもEOFとは解釈されない。
814 :
806 :2009/05/07(木) 23:38:04
>>813 なるほど納得しました。
ありがとうございました。
次数入力式の単位行列を作りたいのですが、うまくいきません 何分初心者なので見にくいかもしれませんが、お願いします #include<stdio.h> int main() { int m, i, j; int ma[i][j]; printf("m = "); scanf("%d", &m); for(i = 0; i < m; i++){ for(j = 0; j < m; j++) if(i = j) ma[i][j] = 1; else ma[i][j] = 0; } for(i = 0; i < m; i++){ for(j = 0; j < m; j++) printf("%d", ma[i][j]); putchar('\n'); } return 0; }
int ma[i][j] ___^^ コンパイルエラー:残念ながら配列の大きさを変数で間接的に指示することは 出来ません。 コンパイルエラー:i , j は未初期化なので不定な値が入っています。 他の変数の初期化等に利用することは出来ません。
>>816 このエラーを100回読め。
はっきり書いてあるじゃん!
>>816 __^^
コンパイルエラー:32ビット処理系ではシフト演算子の上限は32まで
です。
このエラーを100回読め。
^^
コンパイルエラー:残念ながら現状のC処理系では日本語は使えません。
はっきり書いてあるじゃん!
^^
コンパイルエラー:残念ながら現状のC処理系では日本語は使えません。
コンパイラに愛想つかれて無視されてる
>>815 は涙を誘う
>>816 C99対応のコンパイラを使っていて、
エラーにならなかったという可能性もあるね。
たしかに、それでも結局だめなことに変わりはないけど。
>>815 >int ma[i][j];
なんのつもりでこう宣言したのか説明してくれ
823 :
デフォルトの名無しさん :2009/05/08(金) 08:27:26
struct{ unsigned char api_id; unsigned short saddr16 __attribute__((packed)); unsigned char rssi; unsigned char option; }header __attribute__((packed)); gccです。 header構造体のメンバをアラインメントを無視して配置したいのですが なぜか3行目のpackedを追加しないとsaddr16がワード境界に配置されてしまいます。 本来3行目のpackedってっていらないはずですよね?
>>823 gccというかCPUはなんでしょ
unsigned char api_id;
この段階ですでにアライメント調整が発生して
unsigned char api_id;
ここに調整用の1バイト
unsigned short saddr16
となるのは容易に想像が・・・
>>824 CPUはPIC24Fです。16bitです。
6行目のpackedで構造体メンバまとめてアラインメント無視…というわけでは
ないんでしょうか?
だったらpragma使えばよろしかろ。
>>825 構造体にかかってるpackedは構造体全体が奇数バイトであろうが偶数バイトであろうが
アライメント無視して詰めるってことかと
直接関係してくるのは構造体を配列として利用した際の2個目から?
>>827 なるほど、そういうことですか。
納得出来ました、ありがとうございます。
>>828 >826
#pragma pack(1)
PICの場合、構造体を変にパックするとフィールドアクセスの命令数が どかっと増えそうだけど大丈夫?
そこまで詰めまくるのってメモリ不足か古い何かと通信でもするのかね?
シリアルで受け取ったバイト列との共用体になってます。 struct pkt{ unsigned char msb; unsigned char lsb; union{ char api_structure[128]; 〜〜略〜〜 struct{ struct{ unsigned char api_id; unsigned short saddr16 __attribute__((packed)); // big endian!! unsigned char rssi; unsigned char option; }header; char data[100]; } type_rx16; }; }; こんな感じです。略の部分に他にもいくつかの構造体が並んでいます。 もっといい方法があるのかも知れないです。 C言語は昔取った杵柄で書いてるので、おかしな事をしてるかも知れません。
833 :
デフォルトの名無しさん :2009/05/08(金) 10:53:14
defineで()つけてるコードを見たんですが、つけるとつけないで意味が変わるんでしょうか? #define MY_SIZE ( sizeof(struct mine) ) #define MY_LEN ( MY_SIZE * 512 ) int main() { ... read(fd, buf, MY_LEN); ... n += MY_SIZE; ... } 「#define MY_SIZE sizeof(struct mine)」や「#define MY_LEN MY_SIZE * 512」 として()を抜いても結果は変わらなかったのだけど、どうなのだろう。 gcc-4.3.2でコンパイルしています。
>>833 #define MY_LEN ( MY_SIZE * 512 )
ではなく
たとえば
#define MY_LEN MY_SIZE + 512
だった場合
read(fd, buf, MY_LEN*2);
だったりすると
read(fd, buf, MY_SIZE + 512*2);
と置かれる
こういうのを回避するために
#define MY_LEN (MY_SIZE + 512)
としておけば
read(fd, buf, (MY_SIZE + 512)*2);
という置換が行われる
835 :
833 :2009/05/08(金) 11:19:18
struct test { char *namae; int tokuten[3]; }; int main(void) { struct test math[5] = { の様に続けて↑の構造体配列のメンバの配列に初期値を設定するには どうすればいいんでしょうか?
struct test math[5] = { { NULL , 0} ,{ NULL , 0} ,{ NULL , 0} ,{ NULL , 0} ,{ NULL , 0} }; こんな感じ
みす struct test math[5] = { { NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0} };
>>838 ありがとうございます
{}はいらないんですね
月と日をキーボードで入力して、それに対応した星座を表示するプログラムを書きたいのですが、 月が3か4で、月が3の場合は日が21以上30以下、月が4の場合は1以上19以下でおひつじ座と表示したい時 条件を設定する時の複合条件の書き方がわかりません a=3 && b>=21 || b<=31 elseはエラーの表示 a=4 && b>=1 || b<=19という感じに何個もif文を書き繋げていくしかないのでしょうか? #include<stdio.h> void main(void) { int a,b; printf("月入力---->"); scanf("%d",&a); printf("日入力---->"); scanf("%d",&b); if( ( a > 13 ) || ( a == 0 ) ) { printf("Input error!"); } if(?) { printf("?"); } }
if((a==3 && 21 <= b && b <= 31) || (a==4 && 1<=b && b<=19)) printf("おひつじ座");
>>840 繋げていくしかないね
if( (a==3 && (21<=b && b<=31)) || (a==4 && (1<=b && 19<=b)) )
843 :
839 :2009/05/09(土) 00:07:27
エレガントさを求めたいなら 日付を単純に数字(例えば1月1日を1として1-365)に変換して それを数字から星座への変換するように作る手もある。
あ、月毎のテーブル(つっても各31もじゃなく、何日を区切りとするか等)を作るほうが美しいかも。
846 :
839 :2009/05/09(土) 00:36:27
>>844 その発想は無かったです、目から鱗でした
その場合はscanfで入力した月と日が1月1日から何日目なのかを計算するのに頭を悩ませそうですorz
でも参考になりました
12個の要素の配列を使って 各月の日付にいくつ足すかを持てばよい。 別に365じゃなくて、12x32とかの数字に変換しても良いだろ。1方向変換なんだから。 配列をまだ習ってなかったらごめんな。
ここで質問することではないかもしれませんが。。。 環境変数を設定するputenvがコンパイラにより挙動が違って困っています。 あるフリーのDLLが環境変数でパラメータを渡さなければならないのでputenvを使って渡しているのですが、 MSVC++でコンパイルした実行ファイルではDLLに環境変数が渡らず、 mingwでコンパイルした実行ファイルではDLLに環境変数が渡せます。 (ただ開発はMSVC++で行いたいので、mingwでできても意味がありません) ご存知の方がいらっしゃればよろしくお願いいたします。 ※ちなみにSetEnviromentVariableを使うとどっちのコンパイラでも環境変数がDLLにわたりませんでした。。。
>>848 も少し具体的に書いたほうがいい
DLL名称やどんな環境変数を渡すのか
DLLに環境変数が渡らなかったということをどう確認したのか
とか...
>>846 通日を求める式を作ってみた
leapはうるう年なら1、その他は0
m*30 + m/2 + (m<=2 ? 2 : !(~m&9) + leap) + d - 32;
>>848 CreateProcess を呼ぶだけの実行ファイルを作成して
CreateProcess で第7引数を指定するとか
>>850 そもそも month*100+mday なら換算が楽だ
x=month*100+mday;
if(x<=119) yagi
else if(x<=218) mizugame
...
else if(x<=1231) yagi
確かにそうだな 星座は均等に割り振ってるんだと思ったから通日が分かれば÷12でswitch出来るかと思ったんだけど なんか均等じゃない上占いごとに微妙に違うのな
strcut seiza { int start_mon, start_day; int end_mon, end_day; char *name; int start_cday, end_cday; }; というような構造体の配列を作ってだな、 プログラムには最初と最後の日付で記録しておく。 で、先頭でループしてstart_cdayとend_cdayを計算する。 入力したら、(日付のエラーチェック後) 同様にループで回して、通年の日番号でどこに含まれるかチェックする。 と思ったが、この程度で済むなら 通年に直さなくても見通し悪くはならないかもな。
855 :
デフォルトの名無しさん :2009/05/09(土) 05:31:00
>>836-839 もう終わってる話に何だけど
struct test math[5] = {{0}};
これじゃあかんかったっけ?
C99なら
struct test math[5] = {};
でも良かった気がする。
デマカセだったらすまね。
ダンジョンできたよー ■ ■■■■■ ■ ■■■■■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■■■■■■■■■■■■■■■
>>848 失礼しました。dllは漢字→かな変換のkakasiです。
辞書ファイルへのパスを環境変数として設定する必要があるためにputenvしてます。
そのままソースコードをのせます。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void main(void){
HMODULE hKakasiDLL = LoadLibrary(".\\kakasi\\kakasi.dll");
int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );;
char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" );
int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" );
putenv( "ITAIJIDICTPATH=.\\kakasi\\itaijidict"); // 辞書ファイルへのパスを環境変数に設定
putenv( "KANWADICTPATH=.\\kakasi\\kanwadict"); // 辞書ファイルへのパスを環境変数に設定
char* argv[] = {"kakasi", "-JH","-kH"};
kakasi_getopt_argv(3,argv);
char* hiragana = kakasi_do("漢字カタカナをひらがなに変換しますん");
printf("%s\n", hiragana);
kakasi_free(hiragana);
FreeLibrary(hKakasiDLL);
}
上記ソースをmingwでコンパイルして実行すると以下の結果に。
→かんじかたかなをひらがなにへんかんしますん
MSVC++6.0でコンパイルして実行すると以下の結果になってしまいます。
→c:/kakasi/share/kakasi/kanwadict: No such file or directory
c:/kakasi/share/kakasi/kanwadictは環境変数を設定しない場合のデフォルト検索位置です。
※それ以前にMSVC++6.0使ってるのが悪い?
858 :
857 :2009/05/09(土) 11:44:19
>>851 そ、そ、そ、そ、そんな方法が!試してみます!
859 :
デフォルトの名無しさん :2009/05/09(土) 12:05:09
ウォリスの円周率を求めるプログラムなのですが、模範解答と実行結果が異なってしまいます。 もし誤差による場合、それはどうすれば改善できますか? どなたか教えてください。 #include <stdio.h> main() { int n; double p; p = 2.0; for( n=1; n<=10000; n++ ) { if(n%2!=0){p=(p*(n+1)*(n+1))/(n*(n+2));} if( n%1000==0 ) { printf("%8d %le \n",n,p); } } printf("\n"); }
860 :
857 :2009/05/09(土) 12:06:15
連投もうしわけない。。。。
>>851 の方法も試してみましたが、mingwでもMSVC++でも環境変数を認識してくれませんでした。。。
以下は試したコードです。
#include <stdio.h>
#include <windows.h>
void main(int argc, char* argv[]){
PROCESS_INFORMATION pi;
STARTUPINFO si;ZeroMemory(&si,sizeof(si));si.cb=sizeof(si);
char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0\0KANWADICTPATH=.\\kakasi\\kanwadict";
CreateProcess(argv[1],NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,env,NULL,&si,&pi);
}
上記を実行してみたところこれでした→c:/kakasi/share/kakasi/kanwadict: No such file or directory
長々と申し訳ないです。もうちょっと調べてみます。
>>860 \0 を二回重ねる位置が違う
char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0\0KANWADICTPATH=.\\kakasi\\kanwadict";
↓
char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0KANWADICTPATH=.\\kakasi\\kanwadict\0\0";
※最後に \0 が1つ余分になるけど明示するためにあえて二つ書く!
>>857 LoadLibrary より先に環境変数を設定すればいけそうな気がするが、
コンパイラによって挙動が変わるのは納得いかないな
864 :
デフォルトの名無しさん :2009/05/09(土) 12:31:41
>>863 UNIXのTera Term VTです。
>>864 実行結果はどうなる?全然違う値になる?それとも3.14にそこそこ近いの?
866 :
デフォルトの名無しさん :2009/05/09(土) 12:43:18
模範解答 1000 3.140808e+00 2000 3.141200e+00 3000 3.141331e+00 4000 3.141396e+00 5000 3.141436e+00 6000 3.141462e+00 7000 3.141480e+00 8000 3.141494e+00 9000 3.141505e+00 10000 3.141514e+00 実行結果 1000 3.140024e+00 2000 3.140808e+00 3000 3.141069e+00 4000 3.141200e+00 5000 3.141279e+00 6000 3.141331e+00 7000 3.141368e+00 8000 3.141396e+00 9000 3.141418e+00 10000 3.141436e+00 となってしまいます。
>>866 doubleの誤差の前に、もしかしてアルゴリズムが模範解答と違うんじゃない?
模範解答のnが君の2nに当たっているように思えるが。
868 :
デフォルトの名無しさん :2009/05/09(土) 12:52:29
>>867 すいません、気づきませんでした。
でも、その場合どう改善すればいいんですか??
869 :
867 :2009/05/09(土) 12:54:25
>>868 >>866 そんなに聞いてどうするw俺はプログラミングは仕事じゃなくてただの趣味人間なのに。
まあね、おそらくカウンタは君と同じく
for( n=1; n<=10000; n++ )
なんだろうが、適用するところで
p=(p*(2n+1)*(2n+1))/(2n*(2n+2));
としているのだろう。これならifの条件分岐すら要らない。
870 :
デフォルトの名無しさん :2009/05/09(土) 13:01:12
>>869 聞いてばっかりでごめんなさい。
ありがとうございました。
>>870 有名な計算はぐぐればあちこちに転がってるよ
872 :
867 :2009/05/09(土) 13:02:09
あとまあ強いて修正点を挙げるとすれば n++より++nの方が望ましい。 また、p*=(2n+1)*(2n+1)/(2n*(2n+2))と書くことも出来るだろう。
873 :
デフォルトの名無しさん :2009/05/09(土) 13:08:56
>>871 そうなんですか、はじめて知りました。参考にしてみます。
>>872 参考になります。ありがとうございます
875 :
872 :2009/05/09(土) 15:00:27
>>874 おおホントだ、失礼した。
適当にキャストしといてくれな。
__declspec(naked)って何が違うのですか? プロローグ処理及びエピローグ処理を自前でって言われても、あまりピンとこないです しかし、その処理を自前にすることにが、頻繁に呼ばれる関数等の速度向上のポイントではないか、と考えたのですが、 具体例とともにご教授ください
>>876 ようするに何から何まで全部インラインアセンブラでやるから
コンパイラは何もするなというときに使う。
878 :
デフォルトの名無しさん :2009/05/09(土) 17:20:26
>>877 えー、高速化という意味でピンときません
@プロローグ及びエピローグ処理が抑制される
何故抑制出来る仕様になっているのですか?
そりゃあ、それ自体は高速化のための機能じゃないからピンと来るはずがない
>>878 >>877 が書いてくれてるインラインアセンブラを理解した方がいいかも
Cソースだけど、中身はインラインアセンブラを使ったアセンブラソースですよ
というのを教えるためなので高速化はインラインアセンブラの記述次第かと
881 :
デフォルトの名無しさん :2009/05/09(土) 17:49:42
なるほど、 引数をスタックで渡すかレジスタで渡すかをプログラマが決めれる よって高速化も可能ということもありますか?
>>881 まあそうなりますね
そこまでして高速化したいってのがよくわからないけど
コンパイルオプションで最適化度合いを上げてみるとかもやってみました?
良く分からんけど高速化っちゅうより他の言語や環境相手で呼び出し規約が違ってる場合に使うんじゃないの? 割り込みベクタに設定するとか。
配列の中、例えばdouble n[200]の中身が全て同じ数値かどうか調べるので軽い 方法ってどんな方法がありますか?
頻繁に調べるならデータ構造を考え直したほうが
>>885 全部なめるしかないだろうね
工夫するとすると、複数コア環境なら並列化して分割統治できるかもしれない、
doubleで演算すると遅いので整数レジスタで比較する、ぐらいかなあ
889 :
デフォルトの名無しさん :2009/05/10(日) 12:59:54
doubleの等値比較という時点で(ry
他人のコードってなんで読む気がしないんだろうっていつも不思議に思う
俺は自分のコードも読む気しない
そこでコードを読んでくれるコードを書くことにした
893 :
857 :2009/05/10(日) 15:17:51
>>861 全俺が泣いた。ご指摘のとおりです。
>>862 それもおもって環境変数設定する位置をずらしたりしましたがダメでした。
最終的にはkakasi.dllをバイナリエディタで開いて、
c:/kakasi/share/kakasi/kanwadictの部分を編集してパスを変えました^q^
色々勉強になりました。ありがとうございました。
すいません。宿題スレないんでこちらで失礼します。 OSソラリス コンパイラgcc C言語 台形の面積を求めるプログラム キーボードより上底a下底b高さhの値を入力して台形の面積を計算するプログラムを作成せよ。お願いします。
宿題スレいってください
自分が宿題スレみつけられないほどの低脳なのに、 なんでそれを認めないでスレがないとか言っちゃうんだろうな。
>>894 > すいません。宿題スレないんでこちらで失礼します。
あんたバカぁ?
釣りは自重してください。
台形の面積を求めるプログラムって…相変わらず酷いな。
>>899 教師がへぼすぎだからだろ
宿題スレの課題のアホくささみてるとなあ
もうちょっと将来的に役にたちそうな数学系を学ばせればいいのにと思うよ。
ゲーム系で言えばベクトル系だとか物理演算などなど
とりあえず入力と出力をやらせたいんだろう 算数から持ってくりゃ計算部分の説明しないで済むしな
>>901 標準の入出力なんてのもゴミだよな
一瞬で終わらせる内容で課題にするレベルでもなんでもないw
まあそりゃそうだなあ。 でもそれをわざわざ聞きにくるってことはそもそも教えてないのかな? いきなりやってみろと。
>>903 だろうな
それで教師が納得してるというか、楽してるんだよ
プログラム組もうとしたら環境依存のAPI叩かないとまともな演出もできないのに
さっさとそっち教えた方がよっぽど現実で使える。
というかそれでさえ最低限の能力としてしか評価されないというのに。
つうか台形の面積を求めるプログラムってここで質問するレベルじゃないよな
>>905 だねえ
あともっとベクトルの違う勘違いしてるのがbmpのヘッダー解析とか
それは車輪の再開発ですってのも結構あるな。
組み込みでもそんなの要求されるのか?というレベル
>>906 組込だったらあるだろうね。
リンクリストやソートすら、いちから実装することがままある。
物理科だけど大学の数値計算とかの講義受けてると楽そうな仕事だなぁって思う 給料が微妙そうだけどこーゆー簡単な仕事やりたいわ
>>907 でもビットマップがサポートしてる全フォーマットを読み込めるような汎用ライブラリはいらんでしょ
台形の面積はいいだろ。 プログラムに意味があるもん。 文法を理解してるかどうかをチェックするためだけの まったく意味のない課題とかよくあるよ。
ここでえらそうに回答しているような連中にとっては「一瞬で終わらせる」 ようなこと、例えば代入や条件判定やループや標準入出力あたりの簡単な ことでも、理解して使えるようになるまでに発想の飛躍が必要になる人も いるのだよ。理解してしまえばそれこそ本人にとっては「一瞬」じゃんって ことになるんだけどね。 数学科出身で、なぜか初めての言語がHaskellという人がいて、なかなか 優秀な人なんだけどCの代入文の理解で最初苦しんでいたな。
車輪の再発明も課題ならべつにいいだろ。 初心者でもできるレベルで、独創的な課題なんてそんなんあるか。
>>910-912 単品でだして課題を気取る程度じゃないってことでしょ
上で出てるbmpの処理なんてそれこそグラフィックのついでにさらっとやっておけばいいし
台形とかもグラフィックのついででいいのにそっちがメインになってるし
月面の重力は地球の約17%です。 自分の体重を入力すると月での実効体重を 計算し、表示するプログラムを作成してくだ さい。 これ誰か組んでください↑ まったこ分りません
>>914 宿題スレへどうぞ
その前にスレを探すスキルを身につけたほうがいいかも
なければ立つまで待て
ある程度勉強して本当にまったくわからないなら知能障害を疑ったほうがいいですよ
コンパイラとはミドルウェアでいいんですか? そもそもミドルウェアとはなんですか? 初歩的な質問すいません
919 :
デフォルトの名無しさん :2009/05/11(月) 20:57:53
>>918 コンパイラは翻訳機とでも言っておきましょう
C言語などは人間にまだわかりやすい言語
コンピューターはCPUごとに処理しやすい機械語(マシン語)というのが存在します。
これに翻訳するのがコンパイラです。
ミドルウェアというのはソフトウェアの一種です。
特定の機能をまとめた物で、ミドルウェアを使うことでわざわざ開発する手間を省くことができます。
特定の機能というのは、たとえば業務用のプログラムを組む場合はデータ管理をするプログラムは
DB機能を提供してるプログラムを使うことで開発する必要がなくなります。
ゲームでも最近はミドルウェアのお世話になることが多々あるようです。
まあ、どんなプログラムにせよある程度の部分は共通性がでてくるんですよね。
それを纏め上げて開発のサポートをするための物がミドルウェアです。
>>920 レスどうもです。
ということはライブラリ等はミドルウェアに含まれるんですね。
とんちんかんな事言っているようでしたら容赦なく叩いてください。
>>921 うーんライブラリ全般がミドルウェアというわけではないですね。
ミドルウェアといいえばOSよりは小規模ですがそれに近い存在の大きさの物
のことがほとんどですね。
関数の引数に配列(の先頭アドレス)を渡したいんですけど、その配列のサイズを限定するには構造体でくくるしかないんでしょうか?
エスパーが必要だな。一応どうだって出来ると答えておこう
>>924 確かにエスパーだなw
>>923 配列を受け取る関数は自前で作成したものかすでに誰かが用意したものかでも違うし
他人が用意したものなら、その人と相談するしかないんじゃない?
自分で用意した物であればたとえばだけど、引数に配列の先頭アドレスと渡した配列は何個あるか
という数字を渡すようにするとかしかないと思う。
あと構造体で囲った場合は可変させる場合はどうするのとかあるよね
foo bar(hoge hg[5]); みたいな感じで[5]以外の配列は受け取れない、みたいにしたいんです 上のやりかただとうまくいかないのでどうしたらいいのかなと 構造体ならいいんですけど数が増えてくるとうっとおしくて・・・
>>926 cじゃあ無理じゃないかな
というかC#とかで開発してた口?
そういう面度は自分でみるしかないのがC
関数で制御するんじゃなくて、自分で渡さないようにすりゃいいだけじゃ?
>>928 そうじゃないだろ
渡す配列数は常に可変
でもそれを関数側に対応させたい
どう考えてもCじゃ無理です
>どう考えてもCじゃ無理です もとい どう考えてもCじゃ配列の最大数を渡すとかしないと無理です
>>931 へ?
上からの質問を見ると
質問者の本当の欲しいのはhoge hg[]でしょ
で関数内部では0〜4だけを処理させたい
hogeが構造体なのかはしらんけどたとえば hoge hg[10]という配列になってて そのある一定の範囲を処理させたいの?それもと 常に配列のどれか一つを処理させたいの?
>[5]以外の配列は受け取れない、みたいにしたいんです って言ってんだからhg[10]は関数に渡せないようにしたいんだろ。
>>936 は?
両方あるならどっちが求める解か聞いて結論出すのが普通だろ
引数に配列を渡したいのたが、 要素数5(越えても未満でもだめ)であることを強制させたい。 構造体を作るほかに方法はないか?ということだな。 うん、確実なのはそれしかないと思う。
引数でサイズも渡して、内部で比較してエラーを返すってのはどうかな?
なんかいろいろ勘違いして理解してる感じもするなあ
>>923 は
hoge 1個を処理させる関数があってその関数を呼ぶ側がたまたまhogeを配列で確保しててる場合は
foo bar(hoge* ptr)
{
}
とでも関数をしておいて
hoge hg[10]
処理
bar(&hg[5]);
とすればhg[5]の先頭がわたる
でもCの場合hg[6]だろうがアドレスを足せば実は見えるわけで制限というのは
実はできないに等しい
自分変なアクセスをしないつくりにしないと
>>939 比較もなにもCの場合は不正な場所にアクセスして停止するとかでなけえば
見える範囲はどこまでいけるよw
そんな安全機構は無い
頼むからマネージドの世界からこっちくんな
>>942 誰もそんな話しはしてない。
関数に渡す配列のサイズを限定したいなら、関数にサイズも一緒に渡して
関数内部で渡したサイズと求めるサイズを比較して違ったらエラーを返したらどうか
って言ってんの。
>>923 呼び出す側で気をつけるか
構造体にするかのどちらかだね
だいたい、なんでサイズ固定の配列だけを渡したいの?
質問です "abcde"[3] とやると "d" を取得できますが、これと同じことを数列でもできますか?
数列って何の事を言ってる?
"d"は取得できないよ
>>947 #include <stdio.h>
int main(int argc, char *argv[]){
printf("%d\n", (int []){1,2,3,4,5}[4]);
printf("%f\n", (double []){1,2,3,4,5}[2]);
return 0;
}
>>950 ありがとうございます!
どのようなキーワードで検索したらよいのか分からないほど初心者ゆえ
拙い説明になってしまいましたが
思い通りの回答をいただき、感謝に尽きます
何でアホなことなの?
>>950 はCの文法通りなんだけど。
はじめてみた これなに?C99?独自拡張? 俺が無知なだけ?
gccだと -ansi -pedantic でもコンパイルできるからANSI(C89)でもOKじゃないかな。
>>950 gccではコンパイルできたけどVC++ではエラーになった
>>955 何いい加減な事言ってるんだ
K&R本のどこにもこんな書き方は認められていないぞ
認められているのはISO/IEC 9899:1999のみだ
C89はアウト
>>958 ああコンパウンド・リテラルね
まんまC99からしか使えない
961 :
955 :2009/05/12(火) 10:45:25
>>959 あれ… さっきのファイルをもう一回 -ansi -pedantic でコンパイルしたら警告がでた。
a.c:4: warning: ISO C90 forbids compound literals
さっき何で平気だったんだろうと思ってシェルの履歴を見たら -peduntic になってたよ。
gccが何も言ってこないから気づかなかった。
>>950 Cってこんな書き方出来るんだ。
ってかこれって初心者が覚える書き方じゃないだろw
無しで書くとしたらわざわざ変数一個定義する訳だから、初心者とか関係なく 覚えておいて損はないと思う。
enemy = 4; //3以上の数で初期化 while( enemy > 3 ){ srand ( ( unsigned) time ( NULL ) ); enemy = rand() % 10; } 乱数を使って0〜2の数値をenemyに格納する時って、こういう書き方が普通なの? もっと良い書き方あれば教えて欲しい
srand はプログラム起動時に1回書けばよろしい 同じ値でsrand呼ぶとrandが返す値は同じだぞ
ってそれ以前に rand() % 3じゃいかんの?
>>966 あ、そっかw
3で割れば余りは0〜2だもんな。
ゴメン、ボケてた
enemy = rand() % 3; もしくは enemy = rand() / (RAND_MAX + 1.0) * 3;
こういう細々とした定石コードを纏めたサイトって無いのかね
どこに定石が…w
定石なんかいらないだろw その場その場で考えて行けばいいだけで それとも頭悪いの?
定石というか struct x { char a[10]; } とか struct x { int a; int b; int c[]; } こういうのか。
#include <stdio.h> int main(void) { printf("hallo world!\n"); return 0; } 定石と言ったらこれだろJK
無限ループは for(;;) で書くか while(1) で書くか…
構文エラー )が;の前にありません。 srand ( ( unsigned ) time ( NULL ); え?なんで?あるじゃん。 一応srandの上も確認するが、バグが見当たらない。 ,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; …ハハッVC2005め、エラーを出して構って欲しかったのか。 ヾ;;;ハ ノ .::!lリ;;r゙ 全くツンデレだなお前は。 `Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました ~''戈ヽ `二´ r'´:::. `!
つっこむか引き抜くかまよう段階
>>974 whileに定数書いたらコンパイラに注意されたことがある
>>964 同じような間違いをなんどか見たことあるけど、
こういう人って入門書とか読まずにリファレンスだけで勉強してるのだろうか。
リファレンスだけで勉強できるだけの素養があれば、srand()を毎回してはいけないことくらいは分かるんじゃね?
素養がないのに、リファレンスだけでやってるから失敗してるとか。
ループ変数はi〜n それ以外は絶対に使わない
ループ変数のkが出てきた時点でプログラムの構造を根本的に考え直した方がいい
擬似乱数という物を理解してないとsrandの意味は分からんよな
トランプのカードをシャッフルさせようとしています 1番の方法と2番の方法のどちらの方法を選ぶのが良いでしょうか? #include<stdio.h> #include<stdlib.h> void swap(int *a, int *b){ int c; c=*a; *a=*b; *b=c; } int main(void){ int i, card[52]; for(i=0;i<52;i++) card[i]=i; for(i=0;i<52;i++) swap(&card[i], &card[rand()%(i+1)]); // 1番 for(i=0;i<52;i++) card[i]=i; for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52-i)]); // 2番 return 0; }
>>985 「シャッフル アルゴリズム」でググるといろいろでてくると思う。
どちらも良くない for(数回) { for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52)]); } が、まだまし
>>985 fisher yatesでぐぐれ
直感的にも正しい(実質ランダムに一枚づつ抽出と同じであることが容易に理解できる)ものだし
ループは一重で済むし
>>987 糞以下のものをだすな
おお for(数回) { for(i=0;i<52;i++) swap(&card[i], &card[rand()%(52)]); } 訂正や
991 :
985 :2009/05/12(火) 22:30:18
>>989 こんな感じでしょうか
for(i=0;i<52;i++) card[i]=i;
for(i=52-1;i>=0;i--) swap(&card[i], &card[rand()%(i+1)]);
ぱっと見は1番に近いですが
アルゴリズムの内容的には2番と一緒になりますね
>>985 for(i=0; i<52; i++) {
j = rand() % (i + 1);
card[i] = card[j];
card[j] = i;
}
で初期化とシャッフルを同時にやるのはどうよ?
990はバカすぎて話になんねーw
for(i = 0; i < X; i++){ n = rand()%52; for(j = 0; j < n; j++){ swap(&card[j], &card[n+j]); for(k = n; k < 51; k++ ) swap(&card[k], &card[k+1]); } }
>>994 若干偏りのでるアルゴリズムではあるが
実用上は問題ないのでは?
全く偏りの出ない
>>985 に対して後からそれより偏るもの出してどうすんだよw
unixコマンドのsortは数百Mのテキストも平気でソートできるけど どういうアルゴリズムでやっているか概略を知っている方いらっ しゃいましたらご教授下さい。(オンメモリなのかそうでないか とか)
ソース読むとか。 sortにはメモリバッファのサイズを指定するオプションがあるので、 メモリが少ない時は少ないなりのアルゴリズムでやってるのかな。 役に立たんレスで済まんね。
次スレで俺の時代が到来
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。