1 :
デフォルトの名無しさん :
03/04/10 18:49
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
このゴミが!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
スレタイにぬるぽが入ってないだけでもマシか。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>3 >>4 >>5 >>9 と
>>1 の11,12行目
12 :
デフォルトの名無しさん :03/04/11 01:40
すいません、誰かこのプログラム教えてください。 初心者には再帰が難しくて。 typedef struct CELL *LIST; struct CELL { int element; LIST next; }; リスト型を引数とする、 リストのセルがelementとして整数1500を 含んでいるなら1を返し 含んでいないなら0を返す再帰的関数です。 どうかお願いします
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1 リンクくらい晴れ!
>>12 int contain_1500(const List l)
{
if (l->element == 1500) return 1;
return contain_1500(l->next);
}
int foo(const LIST lst) { if (! lst) { return 0; } if (lst->element == 1500) { return 1; } return foo(lst->next); }
>>14 まずった。
if (!l) return 0;
を先頭に追加してくれ。
17 :
デフォルトの名無しさん :03/04/11 02:08
__,,,,,,___ (⌒ヽ:::::::::::'''''-,, <´・\ ::::::::::::::::::ヽ l 3 ハ::::::::::::::::::::::.ヽ, ∫ .<、・_ ( ) 旦 (⌒ ̄  ̄ ̄ ̄ ̄ ̄ ̄⌒) これで何したらいいんだろう・・・ ____ |\ \ \ | | ̄VC  ̄| | |academic| \.|____|
自動変数はスタックに配置されるというのはCの規格で決まっているわけではないですよね。
必ずしもスタックがあるとは限らんし。 ただし、再帰を考えるとスタック的な何かは必須。
20 :
デフォルトの名無しさん :03/04/11 03:16
音声処理プログラムでマイクに向かってしゃべって 「検索せよ」、「閉じる」、「開く」等の10−20程度の単語を 認識させたいと思っています。 音声処理を一からやっていたらさすがにムリなので、 そのようなAPIかなにか公開されてないものかと思って探しています。 もちろん有料のものでかまわないのでご存知の方いたらお教えください。
>>20 Microsoft Voice なんとか
>>19 そういう機能を提供するものを一般的にスタックと呼ぶんじゃなかろうか。
連続してようが双方向リストで提供されてようが。
__________ /o [地獄逝き特別急行] o\ |┃──────────┃|/ |┃ ∧_∧ ┃| ぬるぽ ぉぉぉぉぉぉぉぉん! |┃ (´∀` ) ┃| \ |┃__________┃| |┃__________┃| | \___________________/ | |========================| |========================| |ヽ[■]___________[■]/| |_三三三三三三三三三三_| | | [=.=] | | \ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄/  ̄ ̄  ̄ ̄ / \ Delphi.NET、安値でゲットォーーー!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄(´´ ∧∧ ) (´⌒(´ 匚⊂ミ゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡ /  ̄ ̄ (´⌒(´⌒;; / \
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< ぬるぽぬるぽ! \_/ \_________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< ぬるぽぬるぽぬるぽ! ぬるぽ〜〜〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
27 :
デフォルトの名無しさん :03/04/11 11:22
struct { enum { A , B } e : 1; } x; x.e = B; assert( x.e == B ); 今の仕事で使っている、とある古めのコンパイラで このassertが失敗してびびったのですが、 規格で許された動作なのでしょうか?
>>27 俺は符号拡張とかなんとかが面倒なので、ビットフィールドは
unsignedでしか使わないことにしてる。
メモリのない環境もあるし。
>>27-28 ただのunsignedだとsignedとの比較で悲惨なことになるから
unsigned shortあたりにしといたほうがいいんじゃないか?
>>30 ビットフィールドには int/signed int/unsigned int しか指定できない。
>>31 マジかよ。
俺が何気なく使ってたこの機能はVCの勝手な拡張だったのか・・・。
>>30 っていうか、unsigned とsignedで問題起こるのを
shortにしたからって、なにがどうなるの?
>>27 のassertが通ることを保証しているのはC++の規格でした。
Cだと、enumと互換性を持つ型がどれかで動作が決まるので、処理系依存ってことらしいです。
↓Googleでみつけたところ。
maths.newcastle.edu.au/~rking/R/devel/01a/0098.html
結論は、Cではenumにビットフィールド指定するな、ということで。
C++なら(コンパイラが規格に従う限り)大丈夫らしい。
>>33 ,35
unsigned intだと負数との比較のときとか厄介じゃん?
範囲チェックしたいときとかさ、
struct
{
unsigned int value: 4;
} border;
int checked_value = 何か;
if ( border.value<=checked_value )
{
checked_value unsigned int に格上げされるので、負のとき危険
}
>>36 俺の言ったintにはunsigned intも含むんだけど。
なんでcharとかdoubleのような(unsigned)int以外を使うのかなと。
>>37 unsigned short us = 0;
unsigned int ui = 0;
int i = -1;
assert( us > i );
assert( ui < i );
そもそもunsignedとsignedを比較するほうがどうかしていると思うのだが。
>>36 で、unsigned int を unsigned short にしたからって、なにがどうなるの?
>>40 正しく計算できる
unsigned int と signed int -> unsigned int に格上げ = 符合が失われる
unsigned short と signed int -> signed int に格上げ = だいたいshort>int(環境依存だけど)だから何も失われない
>>41 MSコンパイラの拡張機能なのでどうでもいいことだけど、ビットフィールドでも同様のことが起こるのよ。
ごふ short<int
>>42 そんなことを気にするなら、ビットフィールドに限らずunsignedを
使うときには常にshortにしろって話になると思うが。
そもそも1ビットのビットフィールドでsignedを使うのが阿呆。 そもそもunsigned int signed intを直接比較するのが阿呆。
46 :
デフォルトの名無しさん :03/04/11 20:09
たまにプログラムで Build# のようにビルドした回数を表示してるものがありますが、 ああいう事はどうやれば出来るんでしょうか。 VC++を使っています。
ここがあったのに・・・ いろいろ試したつもりですが 精度的な問題がつかめませんでした。 結果は同じ、速度は掛け算の方が7倍(以上)?のような気がします。 もしかしてつかえる? と思ったのですがやっぱり問題がありそうな気がして恐いです。 ガウスの消去法による、逆行列の計算が 早くなるかと思って期待をしているわけなのですが。
48 :
デフォルトの名無しさん :03/04/11 20:20
本を読んでて疑問に思ったことがあったので質問です。 typedef struct stack{ int data[1]; int top; int size; }stack_t; と言うスタック構造体があって、データをポップする関数があります。 そこで関数の最後に return stack->data[--stack->top]; という記述があるのですが、これはトップのデータをリターンして、 トップを1つ下げるという意味なのでしょうか? それともトップを1つ下げたところにあるデータをリターンするという意味なのでしょうか? 確か、記号の優先順位は--よりも[]の方が上だったような気がするのですが、やはり前者でしょうか? ご教授お願いします。
return stack->data[--stack->top]; --stack->top; return stack->data[stack->top]; data = stack->data[stack->top]; --stack->top; return data; この3パターンを試してみたら?
>>48 この場合--と[]の優先順位は関係ないよ。
>>49 ,50
ご返信ありがとうございます。
後者の方だと考えると物理的にポップが変になってしまう気がするんですが。
とにかく自分で色々と試してみますね。
>>51 それでいいです。ありがとうございました。
よく見るとヒラケだし
55 :
デフォルトの名無しさん :03/04/12 07:18
良スレ上げ
>>48 前置デクリメント
キーワード:後置、インクリメント
win32apiでCopyFile、DeleteFile使い ファイルを移動させると やたらがりがり音がするので Cで移動させたいのです。どうすればよいですか?
>>57 標準ライブラリは結局CopyFileやDeleteFile読んでるから、
標準ライブラリを使わないで作ることになるね。
ドライバ用命令つかったりハードウェアを直接操作したり。
うん。あんたには無理だ。
59 :
デフォルトの名無しさん :03/04/12 09:38
∧_∧ ( ´∀`)< ぬるぽ
構造体のメンバに char * を用意して(他にもbool int floatもある) 構造体自体を mallocで任意の配列として確保します。 で、その後にメンバの char * を使って、任意の文字列をmallocしたいのです。 文字列の確保、格納、使用までは上手く行ってますし アドレスをデバッグにかけてみても、メモリが壊れてる気配も有りません。 …しかし、freeする段階で(ちゃんと、確保した順と逆に開放してます。) エラーが出ます。 DAMAGE debug heap.cだったと思います。 ヒープ領域で何かが起っているのでしょうか? 直し方の見当も付きません。
>>61 おそらく書いたコードに間違いがあります。
移動してからfreeしている?
とりあえず解放してるとこのコードをコピペしる
66 :
デフォルトの名無しさん :03/04/12 12:58
free(malloc(12345);
67 :
デフォルトの名無しさん :03/04/12 12:58
free(malloc(12345));
68 :
デフォルトの名無しさん :03/04/12 13:05
typedefvoid(*FUNC)( . . .); として、 FUNC FuncTbl[]={ hoge1,hoge2,hoge3, }; と関数テーブルをつくり、 hoge1() などは戻り値を返す関数であるとした場合、 long retval=FuncTbl[0]( ); のような事は出来ないのでしょうか。 要約すると、関数テーブルの関数を実行して戻り値を得ることが出来ますか、 ということなんですが・・・。
戻り値なしの関数を指すポインタなんだから、戻り値を返す関数(のアドレス)は代入できないし、それを呼んで戻り値を得ることもできないでしょ。 ・・・・・・・多分。
typedef long (*FUNC)(.);
>>68 typedef long (*FUNC)(...); ならできる。
longは最低でも128bitにしてほしかった。
みなさまレスどうもです。 そのまんまでしたね。 ありがとうございました。
>>68 ,71
一応、ellipsisだけでプロトタイプとして有効なのはC++。と突っ込んでおく。
シネヤ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>59
77 :
デフォルトの名無しさん :03/04/12 14:36
memsetは危険だから使うなと聞いたのですが。
memset()が危なくて使えないようならCは使うな。 PerlとかVBでも使え。
79 :
デフォルトの名無しさん :03/04/12 14:45
80 :
デフォルトの名無しさん :03/04/12 14:46
誰から?
81 :
デフォルトの名無しさん :03/04/12 14:49
標準関数の中で絶対に使ってはならないのはgetsだけ?
(σ・∀・)σ ゲッツ!
83 :
デフォルトの名無しさん :03/04/12 15:17
プッツ!
>>81 strcpyとかもさけるべき
strncpyを使う
strlcpy か astring を使おう。
strncpyは '\0' を付加しない仕様を知っていれば 危険じゃないだろう。
先頭に'\0'を入れてstrncat
ここは酷い釣堀ですね
基本的な質問なんですが、 今更C言語なんて何がいいんですか?
言葉遊び
保守
>>91 はぁ? 何言語と比べて?
プログラミング言語は色々あるからさぁ、
そんな質問じゃあどうしようもない。
ジエンウザ
95 デフォルトの名無しさん:03/04/12 15:47 ジエンウザ
97 :
デフォルトの名無しさん :03/04/12 21:06
>>47 普通は問題になるとは思いません。
1/b がレジスタに確保されれば、丸め誤差すら存在しないと思います。
少なくとも Intel 系 CPU の内部では 80 bits の精度で計算してますから。
C言語のおかげで毎月80万円の給料をもらっている。 明日からC言語が消滅したら・・・JavaかC++でも使うかな(でも給料は半減だ)
使いこなせない言語だと仕事こなせなくて給料下がるよね。
100ゲッツ!!!!
101 :
デフォルトの名無しさん :03/04/13 00:18
⊂⌒~⊃。Д。)⊃[NULL] ヌルポゲッツ!!!!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >_∧∩
_/し' //. V`Д´)/ ←
>>101 (_フ彡 /
n*n行列の計算をしようと思って scanf("%d",&n); int A[n][n],B[n][n],C[n][n]; としたら エラー E2313 arb.cpp 10: 定数式が必要(関数 main() ) と出てきてしまいました 予め大きな数(10)を取っておいて int A[10][10],B[10][10],C[10][10]; とするしかないのでしょうか?
>>103 "malloc 二次元配列" ぐらいでググれ。
>>103 10x10 程度なら、そうするのがいいでしょうね。
ありがとうございます
ここで質問する人ってのは、 自分で調べることも出来ない無能なんですか?
>>107 50% ぐらいはそう。
10% ぐらいは調べてもわからないから質問してる奴。
残り、40% はお前や俺みたいに C言語に関係ないことを書いてるアフォ。
#include <stdio.h> void main( ) { char a; unsigned char b; a = 0xFF; b = 0xFF; printf( "a = %X\n", a ); printf( "b = %X\n", b ); }
char aがsigned charとして扱われているから。 unsigned charとして扱われる処理系なら結果は等しい。
111 :
デフォルトの名無しさん :03/04/13 17:34
printf インテグラルプロモーション 符号拡張 ゼロ拡張
>>108 つまりその10%の人たちは調べても分からない無能なんですね。
>>113 そういう意味では、無能だよ。
それがどうかしたのか ?
無能だっていいじゃない! この子が元気ならそれでいいじゃない!
140 デフォルトの名無しさん:03/04/13 15:37 本のタイトルに「C言語」と入っている本はよくない、みたいなレスを見かけるんですが、 どうしてよくないんでしょうか? スレ立てるまでもない質問でこんあのあったよ。 誰か答えれる?
ワラタ
>>117 C言語は糞だからその解説本も糞だらけ
つまり良本なんて無いってこった
C言語と入ってない本の著者が遠まわしに宣伝してるだけかもしれんが
121 :
デフォルトの名無しさん :03/04/13 20:43
初心者です。 #include<stdio.h> #include<math.h> main() { double th,s; th=1.57; s=sin(th); printf("%f\n",s); } でコンパイルすると /tmp/ccSjmpTh.o: In function 'main': /tmp/ccSjmpTh.o(.text+0x3d):undefined reference to 'sin' collect2: ld returned 1 exit status と表示されてしまいコンパイルできません。 どうすればよろしいでしょうか?
>>122 様
ありがとうございます。できました。
-lmについて調べてみます。
124 :
デフォルトの名無しさん :03/04/13 21:00
初心者です。 グラフィックライブラリを使用する際の #include<???.h> この???には何を入れればよいでしょうか? それとコンパイル時の -?? この??には何を入れればよいでしょうか?
scanfって一般的になんて読まれてるんですか?
126 :
デフォルトの名無しさん :03/04/13 21:09
>125 スケァネフ
129 :
デフォルトの名無しさん :03/04/13 22:58
BMPの表示プログラムソースをヘッターまで読み出せるのですが イメージデータがうまく読み出せません。
それはおきのどくに。
がんばれ。
初心者にはPascalを勧めようよ。 その方がいいよきっと。
昔はミリバールだったな。
おまえら優しいな
135 :
デフォルトの名無しさん :03/04/13 23:20
strncpyの使い方を教えてください。
>>129 もう少し情報がないと答えられない。
それと、これはC言語の問題なの?
>>120 10点。
>>120 がC言語は糞と思う理由が述べられてない。
何言語より糞なのかも不明
最終行・・・さらに意味不明。
135 デフォルトの名無しさん:03/04/13 23:20 strncpyの使い方を教えてください。
(*(int (*)(char*,char*))strncpy)(s,s2);
>>135 「strncpyの使い方を教えてください。」と発言するときに使う。
Palmの辞書ソフト「KDIC」用に辞書ファイルのファイルサイズを減らそうとしているのですが 困ったことに。 コンバート元のフォーマットは hoge /// piyo hoge2 /// piyo2 のように見出し語とデータが「 /// 」で区切られている形になっています。で、 「hoge」の部分が11文字以上ならその行は削除するという方針で以下のように組んでみま した。 が、これを走らせると出力サイズが8MBを超えたあたりで「"read"になることは できませんでした」のエラーが出てしまいます。ちなみに変換元のテキストデータは20MB強。 fgetsなんかは、扱えるファイルサイズの上限なんかがあるんでしょうか? int main() { FILE *rfp, *wfp; char buf[4089]; wfp = fopen("d:\\convert.txt", "w"); if (rfp = fopen("D:\\eijirou\\waeiji.txt", "r")) { while (fgets(buf, 4089, fp)) { if ((strstr(buf, " /// ") - buf) <= 10) { fprintf(wfp, buf); } } } fclose(rfp); fclose(wfp); }
142 :
デフォルトの名無しさん :03/04/14 03:59
>>141 fprintf(wfp, buf);
は
fprintf(wfp, "%s", buf);
か
fputs(buf, wfp);
にするべし。
% を含む文字列があった場合に変になる。
多分、それで変なメモリ領域を読み出そうとして
そういうエラーになったんだと思う。
つまり、"read" はファイルの読み出しじゃなくて、
メモリアクセスの方のなのでは。
>>142 Win2000とかで出るやつだな。直訳らしいが酷い訳だよなぁ。
>>141 >>142 の言うように、printf系関数のフォーマット文字列には定数を与えるのが鉄則。
> if ((strstr(buf, " /// ") - buf) <= 10) { strstrの戻り値を確認していないのが気になる。 " ///"がなかった場合NULLが返るけど、NULLからあるポインタを引いた答えって決まっているのかな? Win2000+VC++6.0の組み合わせでは上の条件式は" ///"が見つからなかった場合、真になるね。
真になっても構わないのならいいんだけど(^_^;)
>>141 while (fgets(buf, 4089, fp)) {
この部分は、
while (fgets(buf, 4089, rfp)) {
だな。
>>141 1行は4089で足りる? オーバーする行があったらどうなるか考えた?
#sedでもawkでも、perlでもできるような気がするんだけど...
#include <stdio.h> void main( ) { signed char a; unsigned char b; a = 0xFF; b = 0xFF; printf( "a = %X\n", a ); printf( "b = %X\n", b ); } 結果 a = FFFFFFFF b = FF どうして結果が違いますか?
>>149 ネタ?
-1と255を代入してそれをprintf()でintに変換して表示してるからだよ。
>>149 charをshort にしたら同じになるよ(w
152 :
デフォルトの名無しさん :03/04/14 17:24
long型の変数に入っている数値を 文字列に変換したいのですが、 何か簡単にできる方法はありませんか? 1桁づつアスキーコードに変換するという方法は思いつくのですが よろしくお願いします
153 :
デフォルトの名無しさん :03/04/14 17:46
レスどうもでした。
>>142 さんの方法で無事解決です。
総ツッコミ受けているように明らかに酷いソースなんですが、自分の環境下で一回満足に
動けばそれでいいというものなのでこんな感じに・・・。こういう場合でもちゃんと作るべき?
>>155 =141
そういうときはawkでも使うのが無難。
cで書くにしても、普段からちゃんと書く癖をつけておけばバグが減ると言うものです。
157 :
デフォルトの名無しさん :03/04/15 05:08
typedef struct CELL *LIST; struct CELL { int element; LIST next; }; これを用いて 整数のリストを引数とする 再帰的な選択ソートのプログラムを教えてくれませんか?
すいません。書き込むとこ間違えました。
160 :
デフォルトの名無しさん :03/04/15 16:10
代入が起るときは 代入先の変数の型に自動で変換される ってことは イメージ的には代入元を代入先の型にキャストした値が 代入されると考えて良いでしょうか?
型格上げできる組合せは限られてるわけだが、許される組合せに関して言えば それでいい。
>>161 助言ありがとうございました。安心できました。
163 :
デフォルトの名無しさん :03/04/15 22:56
計算方法がわかりません。 int value1 = 800000; double value2 = 0.000000125; として、 printf("result = %d\n", (int)((double)value1 * value2)); とすると、結果は1とならず0となります。 なぜ1にならないのでしょうか?
>>163 800000*0.000000125=0.1ですよ。。。
165 :
デフォルトの名無しさん :03/04/15 23:01
>>164 あ、8000000でした。すみません。
関係ないけど、スレタイ「開け」になってるね。
同じ計算を0.1×10と行って1桁ずつ増やしていったら tmp1 = 0.000001; tmp2 = 1000000; の時点で結果が0になってしまった。 キャストの問題でしょうか?
浮動小数点演算がぴったり整数値になると思っちゃイヤン
>>167 gccだと最適化の程度によって答えが変わる罠。
冗談はさておき、小数の方が2の負のべき乗になっていないために
演算精度の関係で積が(1に極近い)1未満になっていると思われ。
最適化を強くすると事前に積を求めてしまうのでイミディエイトの1になってしまう。
というわけで、キャストのときは精度に注意しましょう。
>>170 具体的にどうキャストすれば、int型で出力できるでしょうか?
>>163 >printf("result = %d\n", (int)((double)value1 * value2));
を
printf("result = %d\n", (int)((double)value1 * value2 + 1e-10));
とでもしてみたら?
>>173 1e-10で帳尻が合うのでしょうが、なんか納得いかないです。
すみません。
一旦変数に入れるしか方法は無いかもしれないですね。
%gで1になった・・・
0.000001→double からすでに劣化してるしな・・
>>163 実数演算を厳密にやろうとしたら常に精度に注意を払わないといけなくなる。
例えば、0.1を10回足しても1にはならないという現象も出てくる。
10進数の小数を2進数で表現する以上、避けては通れない道だと思うしか。
>>175 %gだと高々6桁程度の精度で丸めるからな。
>>176 そだね。
逆に、2^(-12)は劣化しないけど。
int main(void)
{
int value1 = 8000000;
double value2 = 0.000000125;
double result;
result = (double)value1 * value2;
printf("result = %d\n", (int)result);
}
結局こうしてみました。
>>175 int型で表現したかったので、すみません。。説明不足でした。
>>177 そうですね。今後気をつけます。
皆様ありがとうございました。
単にintにキャストじゃなくて、近い整数に丸めてからの方が安心。 rintかround。
そうそう。intにするときは「丸めない」からね。xx.yyy...という数のxxの 部分をintに入れるだけだよ。だから179のコードでも結果は同じだと思う。
>>179 で解決する理由がわかりません。
単に他の変数に放り込んだだけのように見えます。
本質的に
>>163 とどう違うのか、誰か教えてください。
IntelCPU系だと、内部演算の精度がdouble以上あるから 一旦doubleの変数への丸めが入る段階で巧くいくこともある。 勿論、巧くいかないこともあるからεを足す工夫は必要。 round()を使ってもいいが、(int) (double値 + 1e-15)でも充分。
つか、
>>163 が"%d"で書こうとしていたところを見ると、この乗算結果が
数学的には整数になることが元々予測できてたんじゃないか?
技術系の計算ではたまにあるよね、そういうこと。
そういったシチュエーションだったら、1.e-10とか1.e-15とかいう半端な数を
突然持ち出すより、いっそ「四捨五入」という意味で、
(int)(double値 + 0.5)
とする方がスッキリ納得してもらえるんじゃない?
質問。 #define fname "data.txt" .... strcat(buf,fname"がないよ");*/strcpyでも良い/* .... という第2引数書き方はC言語的にやって良いのでしょうか? 文字列の扱いはあまりよくわからないので・・・。
突込み所満載だな。 文字列は、"abc" "def"のように書くと"abcdef"と解釈される。 なので、 fname "がないよ"は問題なし。 しかし、 ・define名は大文字にするのが一般的 ・コメントの書き方が変 ・一般的にstrcpy()でもstrcat()でもいいなんてことはないはず ・もしそうだとしたらどこかに無駄があるかもしれない ・そもそもsprintf()を使うほうが無難なケースなのかもしれない とまぁ、このくらい書いておけば後で誰か突っ込んでくれるだろう。
> ・define名は大文字にするのが一般的 これだけ、他のつっこみとレベルがちとズレてるな とチャチャ入れ
>>185 char sz[] = {"/*
#define fname "data.txt"
....
strcat(buf,fname"がないよ");*/strcpyでも良い/*
....
*/"};
こんな感じになってるなら問題ない。
>186 thx! 謎が解けました。 コメントはこのスレ用に書いたものだったけど、どうもやり方間違えたようですな。 sprintfでも良かったんですけど、使ったことの無いやつを試してみたかったのです。(汗 ともあれ、ありがとうございました。
おおありなごやはしろでもつ
伊勢は津でもつ津は伊勢でもつ
charの練習で以下の文をつくりますた void change(char* a){ a = "AAAAAAAAAAAAAAAAAA"; } int main(){ char *test1; test1 ="HelloWorld."; change(test1); printf("test1 : %s\n", test1); return 0; } test1の内容を"AAAAAAAAAAAAAAAAAA" に変えようとしてるのですが"HelloWorld." のままです。 なんででしょう?
>>193 void change(char** a){
*a = "AAAAAAAAAAAAAAAAAA";
}
int main(){
char *test1;
test1 ="HelloWorld.";
change(&test1);
printf("test1 : %s\n", test1);
return 0;
}
>>194 それだと動きました。どうもです。
でも、どうしてポインタが2つも必要なんでしょう?
>>195 ポインタ変数に書き込んでもらう必要があるから。
int 変数に書き込んでもらうには...
void change(int *x){
*x = 123;
}
int main(){
int a;
a = 0;
change(&a);
...
}
とするのと同じ。
今回は、たまたまポインタ変数だったから 間接演算子 '*' が2個並ぶ。
本当に超初心者的な質問で申し訳ないのですが、神の方教えて下さい。 appleを入力した数の分だけ表示させるというプログラムを作ろうと 思って下のようなソースを書いたのですが、実行すると no newline at end of fileと出ます。何処がおかしいのでしょうか? 間違ってる箇所がどうしても見つからないので分る方ご教授下さい。 ちなみにコンパイラはgccでCygwinで実行してます。他のソースを実行する 際は問題は起きてません。 #include <stdio.h> main() { int a , b ; scanf("%d" , &a); for( b = 0 ; b < a ; b++ ) printf("apple "); }
なんで最後に改行が無いとwarningになるの?
>>200 ハッカーは改行で終わっていないと気持ち悪くなるらしいです。
198,199の方々の神に感謝。 きちんと実行できますた。 こんなくだらないことで2時間も延々と迷ってた自分が恥ずかしくなりました。 やっぱり基礎知識は重要ですね。本当今日が今までで一番2チャンが有効活用できますた。
>>202 規格で改行で終わっていなければならないと決められているから。とこのスレか前スレで誰かが書き込んでいたけど、本当かどうかは知らない。
if(ferror(fin)) perror(NULL); としたいのですが、ferror() によって errnoが書き換えられる事はないのでしょうか?
ない
C そのものはフリーフォーマットでも、プリプロセッサは行処理するから・・・とか?
ホワイトスペースの文字コード(isspaceが真を返す範囲)を得るにはどうしたらよいですか? # setlocale 対応で
char ch[256]; for( i = 0; i<255; i++) ch[i] = isspace(i); でとれる。
なんで255を除くの?
>>212 255は、どのロケールでもisspaceで真にならないから。
とボケてみる。
214 :
デフォルトの名無しさん :03/04/17 04:56
夜分すいません。 WinXP,BCC32で、 -------------------- #include <stdio.h> void main(void){ char str[15]="abcdefghijk"; int *p; p=str; putchar(*p); putchar(*(p+1)); putchar(*(p+2)); putchar('\n'); } -------------------- 解説書ではabcと出力されるとあるのですが、aeiと出力されました。 変数を変えて+3,+4にしても1ずれるはずのものが4づつずれます。 4飛びになってしまうのはなぜなのでしょう?
215 :
デフォルトの名無しさん :03/04/17 05:01
それは p が int* だからです。 char* p にすればよろし。 理由は自分で調べれ...
216 :
デフォルトの名無しさん :03/04/17 05:03
>>215 手がかりThx.
お礼に何か差し上げたいところですが何も無いので跳躍します。
C言語ってなんですか? どこかの国の言葉ですか? エスペラントみたいな?
とりあえず名前すらも知らんやつはプログラマじゃないな
>>217 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
| 1点!!!! |
|_________|
∧∧ ||
( ゚д゚)||
/ づΦ
\ (___ノ
220 :
デフォルトの名無しさん :03/04/17 12:15
配列を使って縦50、横6で数字を0から並べたいのですがどうすればよろしいでしょうか?
221 :
デフォルトの名無しさん :03/04/17 12:27
>>220 配列にタテヨコはないが、二次元配列を使えばいい。
222 :
デフォルトの名無しさん :03/04/17 12:36
ありがとうございます、二次元配列を使って作っているのですが、どうも・・うまく動かないのです。
224 :
デフォルトの名無しさん :03/04/17 12:46
# define MAX_ROWS 6 # define MAX_COLS 50 #include <stdio.h> int main() { int table [MAX_ROWS][MAX_COLS]; int x; int y; for (x= 0; x<MAX_ROWS; x++) for (y= 0; y<MAX_COLS; y++) { printf("%d ", table[MAX_ROWS][MAX_COLS]); } fflush(stdin); getchar(); } 超初心者ですみません。
>>224 #define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>
int main()
{
int table [MAX_ROWS][MAX_COLS];
int x, y;
for (x= 0; x<MAX_ROWS; x++) {
for (y= 0; y<MAX_COLS; y++) {
printf("%d ", table[MAX_ROWS][MAX_COLS]);
}
printf("\n");
}
return 0;
}
table[MAX_ROWS][MAX_COLS]は table[x][y]でしょ。
tableに代入してないよ?
二つのfor文が上下逆さじゃない?
>>223 #define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>
int main(){
int table [MAX_ROWS][MAX_COLS];
int a=0,x,y;
while(a<300){
for(y=0;y<MAX_COLS;y++){
for(x=0;x<MAX_ROWS;x++){
table[x][y]=a;
a++;
printf("%d ",table[x][y]);
}
printf("\n");
}
}
return 0;
}
汚いけど...
>>229 ありゃ?これで...
#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>
int main(){
int table [MAX_ROWS][MAX_COLS];
int a=0,x,y;
while(a<300){
for(y=0;y<MAX_COLS;y++){
for(x=0;x<MAX_ROWS;x++){
table[x][y]=a;
a++;
printf("%d ",table[x][y]);
}
printf("\n");
}
}
return 0;
}
232 :
デフォルトの名無しさん :03/04/17 13:58
>>231 while{}は不要。
xとyの二重ループで300回じゃん。
皆さんありがとうございます。難しいですね、プログラミングって
234 :
デフォルトの名無しさん :03/04/17 14:27
プログラミングは積み重ねだからね。 あ、こういう質問は宿題スレのほうがいいかも。 宿題じゃなくても。
別に配列使わなくてもループだけでいいのでは。
for(y=0;y<MAX_COLS;y++){ for(x=0;x<MAX_ROWS;x++){ table[x][y]=a++; printf("%d ",table[x][y]); } printf("\n"); } プ━( ´,_ゝ`)━( ´,_ゝ)━( ´,_)━( ´,)━( )━m9( ゚,_ゝ゚)プッ!!
238 :
デフォルトの名無しさん :03/04/17 14:35
>>236 配列使ったのは、たぶんあとで拡張するために。
>>237 %3d にするとケタがそろうよ。
%3dを使うとなぜ桁がそろうようになるのですか?
(^^)
241 :
デフォルトの名無しさん :03/04/17 16:24
242 :
デフォルトの名無しさん :03/04/17 17:49
アドレスからそのアドレスに割り当てられている変数名(文字列)が 取得したのですがどうすればいいですか? int a; int b; int c; : : printf("a=%d",a); printf("b=%d",b); printf("c=%d",c); ←こいつらをLOOPさせて1行にできないか?
printf("a=%d b=%d c=%d", a, b, c);
printf("c=%d ", c, printf("b=%d ", b,printf("a=%d ", a)));
実際はa,b,cの3種類ではなくて 1万個ぐらいの変数(!=配列)があるんです。 1万行のprintfを書くかしかないのか・・・
設計を見直せ
環境依存で良ければ、int i, a=1, b=2, c=3, *p; if(a<c)p=&a; else p=&c; for(i=0;i<3;i++) printf("%d ", *(p+i));
1万もの変数って何の変数?
つうかマルチポストうざい
251 :
デフォルトの名無しさん :03/04/17 19:30
1マンコぐらいの変数でがたがた言ってる奴って 大規模システムの開発とかやったことないんじゃねぇの?プッ
int i; while((i = getchar()) != EOF) printf("printf(\"%c=%%d\",%c)", i, i); でコードの自動生成はどうだ?
sizeof(int) * 10000 = 40000byte = 40kbyte ところで、そんなにたくさんの変数の命名規則はどんな感じ?
254 :
デフォルトの名無しさん :03/04/17 19:47
>252 変数名手打ちするそれの、どこが自動生成なんだと小一時間...(ry
さっさと配列なり適切なものに直せ
>255 例えばお前はソースを追っていて配列の255番目に入ってる値の意味が何なのか すぐにわかるか?いちいち調べる事になるだろ? コーディングする時も大変な事になるぞ。 名前からその変数の持つ意味が直感でわかるような変数名が理想なわけ。 素人はすっこんでろ。
>>256 だからさっさと直感で分かるような変数名に直せっつってんだよ。
職業アマグラマは素人に戻れ。
>>242 やりたいこととコードが合っていないと思うのは俺だけか?
つーかCじゃ不可能だろ・・・・ コンパイル&リンクしたらもう変数名なんて無意味なものになるし。
情報を小出しにしないで、もっとちゃんと説明しる。 じゃなきゃ、答えられないって。
逆(変数のアドレスを列挙する)ならできなくもないけどね。 int a; printf("aのアドレスは%pです。\n",&a);
264 :
デフォルトの名無しさん :03/04/17 20:18
アドレスから変数名を割り出したい時ってどんな時だろう。
不可能という事のようですので 1万行書きます・・・ ありがとうございました。
struct{char*name,int*ptr}pee[]={"a",&a,"b",&b,"c",&c,...}; for(i=0;i<sizeof(pee)/sizeof(pee[0]);i++) printf("%s=%d",pee[i].name,*pee[i].ptr); こんな感じにしといて、1行目のテーブルは自動生成か人海戦術で作れ。
267 :
デフォルトの名無しさん :03/04/17 20:21
>>265 ねぇねぇ、どんな状況なの?ものすごく興味があるんだけど。
>264 242のように全変数を変数名付きでダンプさせたい時です。
269 :
デフォルトの名無しさん :03/04/17 20:24
なんでそんなことをしたいのか聞いているんだと思うけど。
もうほっといてやれよ・・・
えーとですね・・ さまざまなシステムから使用される共有メモリ変数があるんです。 (ある領域に連続して宣言されている) その変数はルール上読み込み専用としてるのですが値が壊れる事があるのです。 で、どこで壊れるのか、どのアドレス位置から壊れているのかを 調べる為に全領域ダンプさせたいのです。 で、今後もこのような事が想定されるので 単純にメモリの中身をダンプするのでは無く 変数名=値 という形でダンプする関数を作りたかったわけです。
>>272 デバッグ情報使えよ。MAPファイルとか。
ソースから変数定義を抜き出すプログラムでもつくってソースつくりゃいいじゃんか
>>272 その壊れた領域のアドレスを元にそれを参照している変数(言い方がおかしいな・・・)の名前を得たいってことか?
>>274 当然1万行手打ちとかコピペなんて作業はしてませんよ。
ただ同じようなコードが1万行続くのがスマートじゃないなと思って
質問してみただけなんですよ。
ほかになんかあります?
>275 アドレスから変数名がわかれば FOR文で回しながら 変数名=値 をダンプできるなーと思ったんです。 >277 はい、とっくに作って実行済みです。
279 :
デフォルトの名無しさん :03/04/17 21:19
#include <stdio.h> typedef struct { char name[20]; int height; float weight; } creature; int main(void) { creature nullpo = {"Nullpo", 60, 30.0}; printf("&nullpo = %p\n", &nullpo); printf("&nullpo.name =%p\n", &nullpo.name); printf("nullpo = %u, %p, %c, %s\n", nullpo, nullpo, nullpo, nullpo); printf("name : %s\n", nullpo.name); printf("height : %d cm\n", nullpo.height); printf("weight : %.1f kg\n", nullpo.weight); return 0; }
//--------------------------------------// &nullpo = 0064FDE8 &nullpo.name =0064FDE8 nullpo = 1819047246, 00006F70, , (null) name : Nullpo height : 60 cm weight : 30.0 kg //--------------------------------------// 構造体の勉強に取り掛かったのですが、詰まりますた。 nullpoとnullpo.nameのアドレスは等しいのにnullpoの中身を 見ると、(null)などと出てきて・・・ nullpoの中身の数字は何を表しているのか、教えて下さい。 お願いします。
281 :
動画直リン :03/04/17 21:25
>>279 nullpo構造体の先頭アドレスだろ。
ごめんウソ。
つーか、構造体変数の値を参照しようとしたことない。 代入にしか使ったことないや。 nullpo2 = nullpo;
レスどうもです。 これは、知る必要の無い事なのでしょうか? それとも、私は何かとんでもない勘違いをしているのか・・・ とりあえず、勉強を進めまつ。
printf ("nullpo = %c, %s\n", *((char *) &nullpo), (char *) &nullpo); これで動くでしょ。
>>242 search & replace & #define
>>286 ありがとうございます。
わかりました。
289 :
デフォルトの名無しさん :03/04/18 01:20
if(10==010) printf("同じ\n"); 同じと表示されないんですけど。
010って8進数じゃないの? 10 == 8
>>251 というか、万単位の (おそらく静的な) 変数を
寿命も考えずに維持するというのは
莫迦のすることですよ。
いや莫迦にはできない。並外れた根気が必要だもの。むしろ電波だろ。
293 :
bloom :03/04/18 01:54
294 :
デフォルトの名無しさん :03/04/18 05:51
>>291 一つの関数の中に自動変数が一万個以上あるんですが・・・・
ちなみにその関数は43000行程度あります。
その関数をまず捨てろ。 一から書き直せ。
296 :
デフォルトの名無しさん :03/04/18 07:42
特定のアプリケーションがインストールされていたり、インストールされたら何か反応するプログラムを作りたいのですけど とりあえずどうすればいいでしょうか?
297 :
bloom :03/04/18 07:54
#include <stdio.h> int main() { if(fopen("/usr/local/bin/prog","r")) printf("インストールされているね\n"); else printf("インストールされていないみたい\n"); return 0; }
>>299 ファイル閉じる以前の問題があると思わないか?
>>296 C言語にはインストールと言う概念はありません。
OSが特定できればそれを知る手段があるかもしれないけど。
>>300 ネタだから構わないじゃないか。
fcloseしなくても、プログラムが終了すれば自動的に クローズされるんだけどね。
#include <unistd.h> #include <stdio.h> int main () { while (!fopen ("/usr/local/bin/prog", "r")) sleep (60); printf ("インストールされているね\n"); return 0; } これで何かまずいの? 終了したときにcloseしてくれるとか読んだような気がするんだけど
それはさすがにまずいだろよ
>>303 fopen() の挙動について小一時間調べとけ。
Pascal初心者ですが、参考になるサイトなど教えてください。
>>307 何故ここで聞こうとしたのか、教えてもらいたいな
310 :
デフォルトの名無しさん :03/04/18 17:13
scanfは空白文字も改行としてしまうので、それを解決するためにwhile、getchar、 getsなんかを組み合わせた2行ぐらいのがあった思いますが、教えてください。
>>310 こんなのはどうだ?
char buffer[256];
fgets(buffer, 256, stdin);
>>310 空白は改行にはならないぞ。
空白を含む文字列を取得したいなら、scanf()のマニュアルをよく読め。
念の為に言っておくが、「printf()とscanf()のフォーマット文字列は
互換性がある」だなんて書いてある入門書は捨てろ。
313 :
デフォルトの名無しさん :03/04/18 17:39
名前空間の使い方を教えてくだされ。
>1
namespace hoge;
>>276 UNIXのfileコマンドの
magicファイルを自動生成するプログラムじゃ駄目ですか?
317 :
デフォルトの名無しさん :03/04/18 18:25
お答えありがとうございます。
>>311 変数の宣言を含まずに2行だったような。EOFも使ってたような。
>>312 [\n]とか書くとできるのは知っているのですが、scanfでは無いのが
急に気になりだしてしまったので。
while((c=getchar())!=EOF)
こんなのを含んでたような。思い出せません。
なんだ、改行を探したいのか? もう少し何がしたいのかはっきりしてくれ。
320 :
デフォルトの名無しさん :03/04/18 18:56
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_Q 20 /*表示する問題の個数*/ #define MAX_LINE 128 /*入力行の最大数*/ void main(void); void kuku(int questno); void print_result(void); int good_answers = 0; /*正解の個数*/ /* * 関数mainは九九の練習をする。 * 問題をMAX_Q回繰り返す。 * 最後に結果を表示する */ void main(void)
321 :
デフォルトの名無しさん :03/04/18 18:56
{ int i; float rate; /*現在時刻を使って乱数の「種」を得る*/ srand((unsigned int)time(NULL)); printf("これから九九の問題を %d 問出します。\n",MAX_Q); good_answers = 0; for (i = 0; i < MAX_Q; i++) { kuku(i); } rate = good_answers * 100.0 / MAX_Q; printf("問題は %d 問ありました。\n", MAX_Q); printf("%d 問は正解したよ(゚〇゚)マルー \n",good_answers); printf("でも%d 問間違ったよん♪バーカ(゚д゚)マズー \n", MAX_Q - good_answers); prontf("正解率 %0.1f %%です。\n",rate); printf("\n"); printf("ごっくろ〜さん♪")
322 :
デフォルトの名無しさん :03/04/18 18:56
} /* *関数 kukuは九九の問題を一問出し、答えを待つ。 *正答、誤答の別を表示する。 */ void kuku(int questno) { int x, y, result; char buffer[MAX_LINE]; x = rand() % 9 + 1; y = rand() % 9 + 1; printf(" [第 %d 問] %d × %d =", questno + 1, x, y,); fflush(stdout); gets(buffer); result = atoi(buffer); if (x * y == result) { printf("うむ、それでただしいのだ。\n"); good_answers++; } else { printf("ざ〜んねん(みのもんた風に)\n"); } printf("\n"); }
mainも宣言するとは珍しいな。
324 :
デフォルトの名無しさん :03/04/18 19:22
学校で強制的に打たされたプログラムでつ
>>320 そのプログラム、いとも容易く暴走できるな。
static void hoge(void) という関数があるのですが。 戻り値が static void になっているのは どういうわけなのか理解できません。 どういう都合があるのでしょう。
>>326 関数内と関数外ではstaticの意味が全く違う(なんでそうしたんだろうね??)。
staticがついているので、そのhoge関数はほかのファイルからは呼び出せない。
externの逆ということでintern(al)にすればよかったのにな。
C言語はなるべくキーワードを増やさない方針なのだ、とどっかで聞いた
autoなんて無意味なキーワードを加えているくせに ゴルァヽ(`Д´)ノ
ポインターはどんな時使うのか教えろ
ポインターを使うたびに5セントもらってたら今頃俺は大金持ちだぜ。
>>331 auto は、無意味じゃないぞ。
あそこには、static と auto が書けて、省略時解釈が auto になってるだけだ。
336 :
デフォルトの名無しさん :03/04/18 22:33
>>294 良く出来たコンパイラだな〜。
でも最適化は弱そうな雰囲気。
337 :
デフォルトの名無しさん :03/04/18 22:46
339 :
デフォルトの名無しさん :03/04/18 22:55
なんで配列の添え字は符号ありなの?
>>339 配列の添え字にunsignedしか使えなかったら不便じゃん。
size_tは符号なしなのに!!
342 :
デフォルトの名無しさん :03/04/18 23:47
343 :
デフォルトの名無しさん :03/04/18 23:51
初心者 Delphi 中級者 VB.NET C#.NET 上級者 C++ 男根世代 C VB 女子高生 アッセンブラ 乞食 Perl 朝鮮人 Java
344 :
デフォルトの名無しさん :03/04/19 00:03
Cのrand()関数を呼び出すとき乱数表から順番に取ってきてるんでしょうけど 初期値を変えられないですか? runした時間によって変えたりしたいんですけど
>>344 一応言っておこう。
rand() 関数は、おそらく乱数表を使ってはいない。
世の中には線形合同法という洒落込んだ名前の付いた乱数生成アルゴリズムがあり、
乱数は計算によって生成されている。
まぁ、どのアルゴリズムを使っているかはコンパイラ次第であり、確実に線形合同法
が使われているかどうかは俺の知識を超えるがな。
でもって、たいていのアルゴリズムでは、乱数を利用するための初期値が必要になる
のだが、そのために srand(int) という関数が標準で実装されている。
話をまとめると、
「rand() を使うプログラムには main() の先頭に srand(time(NULL)) を書け!」
ということだ。マジレス終了。
>>346 srandの引数はunsigned intだぞ。
srand(clock()) と言ってみるテスト
環境依存だけど、PIDを種にするのってあかん?
>>348 わ。ほんとだ。誤文スマソ。
まーでも time() の戻り値も time_t なワケだしどーでもいーや〜。と逝ってみるテスト
352 :
デフォルトの名無しさん :03/04/19 01:24
C言語で円を書きたいんですけどグラフィック関数使うんですよね? 図形を書くときって、特別な設定が(何かをインストールするとか)必要なんですか?
>>352 今の環境にそういうライブラリがなければ入手してインストールする。
>>350 (・A・)イクナイ
起動時にスクリプトなんかから自動的に起動されるプロセスの場合、
毎回毎回 PID が同じになる。慣習通り、time と組み合わせるのがいいと思うよ。
PIDとかいうなら、 /dev/randamからもってきたらええやん。
>>339 int nul[65], *po = &nul[32];
として、添字の範囲を -32〜+32 ということにしたいのでしょう。
randam て。
>>349 clock()はプロセスが起動してからの時間だからやめた方がいいよ。
起動直後に呼ぶと毎回同じ値になる可能性がある。
srand((unsigned)(time(NULL) ^ clock()));でどうよ?
>>352 テキスト画面に描くとか。(計算は自前)
>>358 だから、おとなしく time(NULL) じゃダメなのか。
>>358 > 起動直後に呼ぶと毎回同じ値になる可能性がある。
なら、
> srand((unsigned)(time(NULL) ^ clock()));
も毎回同じ値になる可能性があるんでは?
363 :
デフォルトの名無しさん :03/04/19 22:04
初心者です。 自分以外のEXEを実行させるプログラムを 教えてください。
正規表現なんですけど char で放り込んだ変数の判断なんですが perlの場合の if($hoge =~ /.jpg$/){}のように if文書きたいんですけど Cだとどうかくんでしょうか?
3日でわかるC言語には書いてませんでした。 初心者向けの講座があるサイトも結構回ったんですけど 解説してる所はありませんでした。 使う命令だけでもいいんで教えてくれませんか?
if ( !strcmp(hoge,"/.jpg") ){}
>>366 system(),fork(),exec*(),pipe()
Windowsなら
ShellExecute(),CreateProssece(),
あたりか
370 :
363と366 :03/04/19 23:07
ありがとうございます。
>>369 綴り間違い
CreateProcess
>>367 そりゃちゃうやろ。
>>364 適当な正規表現ライブラリを探すか、自分で作れ。
if($hoge =~ /.jpg$/){} ぐらいなら難しくはない。
sscanfでできないかなぁ。。。。
あ、だめだな。
うーん 正規表現というか 引数与えて 最後の4バイトを返すやつで判別するほうが 楽かな? C言語は昨日はじめたばかりでWebとかいろいろ探しているんですけど 難しい・・・
#include <string.h> int endsWith(const char *str, const char *suffix) { return (strstr(str, suffix) - str) == (strlen(str) - strlen(suffix)); }
#include <process.h> main() { execlp("てすと.exe", "てすと.exe", NULL); return 0; } 一応できました。とりあえず正常に動いてるんですが 無駄な部分や、もっと簡略にできる部分がありましたら ご指摘ください。
if($hoge =〜 /\.jpg$/){} と言ってみるテスト。本質ではない。
>>377 要は拡張子の判定がしたいみたいですが。だったら、
ext = strrchr(path, '.');
で、ext に文字列が入ります。ドットが含まれていない
場合には ext が空っぽなので、直後に if で例外処理を
適当にやってみてくださいな。
>>379 exec は成功したらそこで終了です。
なので return(0); には来ません。来るとしたらそれは
exec に失敗しているので、exit(1); とかじゃないでしょうか?
∧_∧ ( ^^ )< ぬるぽ(^^)
なんでstrrchrはあるのに、strrstrはないのだろう。
>>377 そもそも環境は ?
拡張子を判別したいと言うのなら、環境によってはパス名称を分解するライブラリ/API を持ってたりするから、それ使った方がわかりやすいと思うぞ。
元々gd1.8.3がマシンに
ユーザー権限でgd2.0.12をインストールして
簡単なやつ
#
ttp://www.ed.kagu.tus.ac.jp/~tbn/prog/gd.html みたいのをgccでコンパイルしたいのですがうまくいきません
gcc -o sample -I/home/test/tmp/include -L/home/test/tmp/lib sample.c -lgd -lm
でコンパイルは通るのですが
実行すると
./sample: relocation error: /usr/lib/libgd.so.2: undefined symbol: jpeg_resync_to_
restart
となりうまくいきません
Delphiみたいに実行時のパッケージをつかって構築みたいに
外部ファイルを使わないで実行できるようなコンパイルオプションは
ないのでしょうか?
libjpegやlibpngなどはリンクでかまいませんが とりあえずgdが入って無い
システムでも動くようなバイナリを作るのは無理なのでしょうか?
>山崎渉くん (僕がブルーだって言ってるのにレスが笑顔でぬるぽ・・・) (流石だ・・・) ∧_∧ ( ´∀`)< ぬるぽ
すいません、誤爆です…。
389 :
デフォルトの名無しさん :03/04/20 09:46
-Bstatic って gcc で使えなかったっけ?
#include <stdio.h> と書くと /usr/include/stdio.h を読みこみますよね。 しかしこれに書いてあるのは宣言だけなんですけど、 定義はどこから持ってくるのでしょうか。
#includeはその場でファイルを展開するんだよって答えで良いのか?
stdio.h の定義なら /usr/lib/libc.a でいいのかなあ。 -I や -L でヘッダやライブラリのパスを追加できるって感じですか。 デフォルトのものはどうやって調べるのでしょうか?
>>390 Linux だと標準では
ヘッダーは /usr/include
本体は /usr/lib
あたりかな。
C標準ライブラリだと、 /usr/lib/libc.a とか。
コンパイラオプションの -I -L とか調べてみては?
382さん、ありがとうございます。 改良します。
とりあえずccでメイクできるようになりました・・・ だけど既存のファイルを読み取って拡大するようなやつを つくったら汚い汚い・・・GDModuleってこんなもんなの? なんかカラーのがセピア色になってる・・・
質問です。 K&R本演習3-1, binsearchのループ内のテストを一回で済ますプログラムを書けというんですが、 if else if else を if else にしろということなんですか?
ゲームボーイアドバスンをパソコンのジョイスティクとして使う標準関数は何ですか?
>>398 joy_gameboy_advacen()で検索してみ
400 :
デフォルトの名無しさん :03/04/20 17:29
こんど、C++を勉強しようと思ったのですが その前にCを覚えたほうがいいと思いCの勉強を始めました。 NS−DOS上で動くプログラムの習得、なんか、原始的な勉強を しているような感じです。 こような考えかたを持つ者は、だめでしょうか。
>398 fopen()だよ
>400 今の時代、Windowsを使った方がいいよ。 メモリモデルとか意識しなくていいしさ。
403 :
デフォルトの名無しさん :03/04/20 17:55
404 :
デフォルトの名無しさん :03/04/20 17:56
>>400 そのMS-DOSってのは本物のMS-DOS?
それともWindowsのMS-DOSプロンプト(コマンドプロンプト)?
>400 MS-DOSならデバイスドライバを介さずに直接ハードウェアにアクセスできる利点はあるけどね。
NS-DOSとは、、、、 ~
407 :
デフォルトの名無しさん :03/04/20 18:06
>>404 WindowsのMS-DOSプロンプトですよ。
>407 んだったら >403 なにが「そうですよね」だよ 馬鹿にしやがって
>>408 いやいや、16bitコムパイラつかってるなら問題ない。
410 :
デフォルトの名無しさん :03/04/20 18:41
全ての環境変数を列挙するのは標準機能だけじゃ無理?
envpは標準じゃないし、getenvはキーが分からないとだめだし・・・
ていうか、環境変数というモノ自体が標準じゃない
>>412 ならなぜgetenvという標準関数があるんですか?
>>397 問題がわからないが
再帰関数なら次の深さのifで代用?
プログラミングと いいおんな どっちが すきだ?
>>415 問題は、二分探索で、ループ内の比較を2度ではなく1度しか行わないように変更する。
答:ループを抜けてから1度合致を判定する
どうしてDQNの耳には硬貨が入っていますか?
419 :
デフォルトの名無しさん :03/04/21 13:41
初心者なんスけど、 ファイルポインタに標準入力(STDIN)をセットするやりかたが分かりません。 どなたか教えてくれませぬか?
FILE *fp; fp = stdin; fprintf(fp, "なんでこんなことしたいの?");
FILE *fp = stdin;
でもこれローカル変数じゃないと初期化できないよね。 なんかのソースを修正した記憶がある。
えうー、420はどういう結果を望んでいるんだ(w
>>422 stdinやstdoutが初期化されてないと駄目だからね
fprintf(stderr, "
>>420 なんで入力用に開かれたストリームをfprintfに渡すの?");
>>420 &421
ども、ありがd
参考になりますた!!
426 :
デフォルトの名無しさん :03/04/21 16:43
初心者です。 VC++6.0で、現在Cやってます。 プログラム実行時、 ダラダラと文字が表示されるのが見にくいので、 コマンド入力ごとに画面消去がしたいんです。 いろいろサイト調べたら、 制御コード ESC [2J とか printf("\033[2J"); /*画面消去*/ ってあったんで、コレダ!と思って加えたんですが、 変な文字が出るだけで消去できませんでした。 消去できない理由を教えてください。
for (i = 0; i < 8192; ++i) putc('\b');
putc?
429 :
デフォルトの名無しさん :03/04/21 16:55
>>426 >printf("\033[2J"); /*画面消去*/
これはエスケープシーケンス文字列って奴なんだけど
Windows9.x系のOSしか対応してないはずだよ
試してないけどsystem("cls");で出来るかも知れない
ansi.sysが組み込まれていない
僕のはXPだからだめだったんですね。 system("cls"); いけました! 答えてくれた皆様、 本当にありがとうございました!
テスト終了でし、結果は予想通り。 #include <stdio> main(){ printf("テストしてみますね\r\n"); printf("適当な文字列生成中もな〜"); system("cls"); printf("あれれ前二行が出力されてないもな\r\n"); printf("CTRL+Cで終了してね"); while(1); }
>>431 あらら、ご本人さまに先を越されてしまったw
つーことで頑張ってね〜
434 :
デフォルトの名無しさん :03/04/21 17:08
逆にNT系で文字色の変更とかするときはどうすれば良いのやら
435 :
bloom :03/04/21 17:08
MS-DOSの場合、コンソールでエスケープシーケンスを使うには ansi.sys(or ansij.sys)が必要。 これはWindowsになっても変わらない。
>>434 猫とかに乗ってる物
#include <windows.h>
#include <stdio.h>
int main(void)
{
int a;
for(a=0;a<=255;a++)
{
SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE),a);
printf("0x%02x ",a);
}
getchar();return 0;
}
>>438 おお、ども。そんなAPIがありましたか。
>>417 なるほど、最後まで繰り返すわけですね。
出来たがしかしあまり意味がないような。
Q0.1,E0.8,E0.4 正しい括弧付けかどうかをテストするプログラムを教えてください。
>>441 びっくりするぐらい情報不足なのは仕様?
Q0.1,E0.8,E0.4 正しい括弧付けかどうかをテストするプログラムを教えてください… >正規表現かどうかを調べるプログラムです
>>443 びっくりするぐらい情報不足なのは仕様?
参考書片手に勉強してるのですが、 とある例題で ch = getchar(); if(ch < 'f' printf("その文字はfより小さい"); と書いてあるのですが 二行目 'f'とprintfの間に「)」が入るのでは?、と思いました。 この本のhpのミス訂正一覧にも乗ってなかったのでここで質問させていただきます。 教えてエロイ人(;´Д`)
>>445 あんたの言うとおり。
ミスプリなぞしょっちゅう出くわすものだ。いちいちツッコんでいては人生に疲れるぞよ。
なんでエロイ人限定なんだ
っほ 自信が無く、不安でしたので・・・。 お二方、ありがとうございました。
しすぷり
>>448 解答を貰ってすっきりしたら夜の相手もお願いしようって魂胆では。
>>448 エロくなかったらCなんて習得できないだろ
453 :
デフォルトの名無しさん :03/04/22 00:25
MS−DOSプロンプト上の文字のフォントサイズやフォント名を変更する事は 可能なのでしょうか? 可能だとすればどうすれば変更できるのでしょうか?
>>453 確かjpとかusとか打つと出来たんじゃない?
Cのコードからは可能でしょうかね?
一部分のフォントを切り替えながら文字を出したいのか
全体的なフォントを変えたいのか。
どちらにしろ、
>>457 に同感
どちらにしろ、スレ違い
みんな、まともに答えてあげようよ・・・
標 準 C で は で き な い 。
>>1 を 見 よ
>>460 全体ならMS-DOSプロンプトのプロパティから変えれば。
464 :
デフォルトの名無しさん :03/04/22 01:01
あの〜、授業でC言語の基本みたいなのを勉強したものなんですけど、 このC言語でプログラムを組めるとどんなすごいことができるんでしょうか? 今この世に存在してるソフト(ゲーム、PCのアプリケーション、電化製品内の ソフトフェア)ってみんなC言語なんですか!? 趣味でこんなおもしろいことができるよ!とかあるんでしょうか?
みんなCでできてるわけではないが、Cがよく使われてますね。
>>464 この世に存在してるソフトがみんなCなら
他の言語は何のために存在してるんだよ! プンスカ!
...といっても、Cが多いのは確かだろうけど。
趣味なら、パソコン使ってて不便だと思うことを
プログラムで解決したりとか、
あとは適当にゲームでも作って遊ぶとか。
もっとハマると、ただ何かコード弄ってるだけで楽しくなってきたり...。
>>465 >>466 レスありがとうございます!
ではフォートランやアセンブラにはないCのメリットやデメリットってのは
何なんでしょうか?ここまで多いのはなぜ!?
>>467 適材適所。
メリットデメリットなんて、ターゲットにもよるし、人にもよるし。
多いといわれても、何を基準にしているかにもよるから、ナンセンスかな
UNIX厨はCを使いたがるね。
>>470 んじゃ、適材適所じゃない、どんな用途にも使える言語ってのを教えてくれ。
472 :
デフォルトの名無しさん :03/04/22 01:57
数値計算のコードを書いてるのですが、要求サイズが 大きすぎるのかmallocに失敗してその対処に困っています。 大きな領域を一度に確保する良い方法は無いでしょうか?
>>473 うん。つまらんことで悩む時間を考えるとメモリ増設なんて安いもんだ。
どうせ来年あたりにはオンボード1Gbyteが普通になるんだろうし。
とりあえず動作確認用に使ってるテストデータで、 mallocに失敗する要求サイズは25920byteです。 失敗するまでにこの5〜6倍程度の領域を既に 確保しています。 サイズとしてはあんまり大きくないと思うんですけど・・・。 あと、開発に使ってるマシンに積んであるメモリは512MBなので、 余裕はあるはずなんですが。
>>472 まず、どれだけのサイズを確保しようとしてるのかを確認しる。
一度で確保出来ないなら、分割して確保出来るかを確認しる。
デバイスドライバやカーネル周りでも無ければ、
本当に連続した領域が必要な事は少ない。
>>メモリ増設とか言ってる香具師
C言語の範疇では無いのでスレ違い。
8 bitプロセッサでも16bitプロセッサでもCは動く。
まぁ472が組み込み系で無いと思うのは同意だが。
>>475 うちでは32GB積んでいるが、それでも足りない。
mallocが返す領域って連続していると保証されているの??
s/が返す/で得られる/
>>481 Pen4 2G Mem 512MB
RedHat 7.3
GCC 2.96
です。
>>482 実行環境も同じだよね?
mallocで失敗するとは思えん・・・
mallocがNULLを返しているんだよね?
>>484 開発兼実行環境です。NULLが帰ってきてます。
最初の発言以降mallocと書いてますが、実際は
callocを使ってます。
calloc の呪い
>>482 limitだろ。
ulimit (cshならunlimit) してから実行しなおせ
ああそうか。rlimitがあったか。
489 :
デフォルト名無しさん :03/04/22 16:49
質問です。ほとんど出来ているのですが、1〜5までの合計(15)を5の横に置きたいのですが最後に表示されちゃいます。 どなたか助けていただけないでしょうか?よろしくおねがいいたします。 #define MAX_ROWS 6 #define MAX_COLS 50 #include <stdio.h> void rowtotal(int table[][MAX_COLS], int rowadd[]); int main() { int table [MAX_ROWS][MAX_COLS]; int a=1,x,y; int row[MAX_COLS] = {0}; for(y=0;y<MAX_COLS;y++) { for(x=0;x<5;x++) { table[x][y]=a; a++; printf("%3d ",table[x][y]); } printf("\n"); } rowtotal (table, row); fflush(stdin); getchar(); return 0; }
void rowtotal(int table[][MAX_COLS], int rowadd[]) { int row; int col; for (col = 0; col < MAX_COLS; col++) { for(row = 0; row < 5; row++) rowadd[col] += table [row][col]; } for (col = 0; col < MAX_COLS; col++) printf("%d\n", rowadd[col]); return; }
for(y=0;y<MAX_COLS;y++) { for(x=0;x<5;x++) { table[x][y]=a; a++; printf("%3d ",table[x][y]); } //合計表示はここでしょうに。 printf("\n"); }
こういう風に表示したいということかな? 1 2 3 4 5 15 6 7 8 9 10 40 11 12 13 14 15 65 だとしたら、各セルを表示するロジックと合計値を表示するロジックが 完全に分離されている現状ではカラム制御しない限り無理。 っていうか、今のロジックって、 main() { 値設定と表示ループ 合計値計算と表示() } って作りになっているけど、気持ち悪いし上述の問題があるので main() { 値設定() /* これくらいならループでもいいか */ 合計値計算() 合計値セルを値セルと連結() 表示() } ってすれば汎用性が高い部品を幾つも作れて楽しいかと。
>>491 C++にしないように。それと、現行ロジックはまったく無視しちゃうわけね。
>>492 は?MAX_COLSが分ってるならtotalの配列も作れるでしょ?
全然Cだし、ロジック殺してないけど?
495 :
デフォルト名無しさん :03/04/22 17:22
そうです、1 2 3 4 5 15 という感じで表示させたいのです。 table[5][MAX_COLS]の位置に合計を表示させたいんですが。。。 どうも、うまくいきません。ご教授よろしくお願い致します。
int table [MAX_COLS][MAX_ROWS];
int total [MAX_COLS];
こうしたほうがいいんじゃないのかな?
rowtotal(y,table,total);
でこれで処理できるようにする。
あとは
>>491 を参考に。
rowtotalを一括でやっちゃいたいのなら
make_table(table);
make_total(total,table);
view_matrix(table,total);
と三段階に分けたほうがいいかな。
497 :
デフォルトの名無しさん :03/04/22 17:48
melon: 100 apple: 70 banana: 50 ↑このように、特定の位置に頭を揃えて出力する方法はありますか?
いつからCに//なんてキーワードが追加されましたか?
>>497 printf("%6s: %-3d",kajitsu, nedan);で出来ん?
C99ていうくらいだから1999年から?
>>497 sprintf()を駆使しろ。
char buf[適当な長さ];
sprintf(buf, "%-10s%d", "melon:", 100);
:も自動化したかったら,
char buf[適当な長さ];
sprintf(buf, "%s:", "melon");
sprintf(buf, "%-10s%d", buf, 100);
>>497 printf("%10s%d","meron:",100);
printf("%10s%d","apple:",100);
printf("%10s%d","banana:",100);
printf("%-10s%d","banana:",100);
かもしれん。リファレンスみてちょ。
503 :
デフォルトの名無しさん :03/04/22 18:00
>>503 ちょっとだけ凝るなら
>>499-502 の両方の利点を生かして
sprintf(formatstr, "%%ds: %-%dd", kajitsulen, nedanlen)
printf(formatstr, kajitsu, nedan);
とかやってもいいかも。
>>504 それを書くなら、
printf("%*s:%-*d", kajitsulen, kajitsu, nedanlen, nedan);
だろ?
なぜ文字列処理という簡単なことでまともなコードがかけないんだ?
>>505 いや実際はループしてるんだし先にフォーマットを決めちゃわないと
>>506 正規表現なんて未だに情報処理試験の問題に出てくるらしいし
エンコード、デコード、正規表現・・・文字列を舐めちゃいけない
文字列処理が簡単だったらPERLなんて流行ってないよ
ここでやっている文字列処理は簡単だろ?
>>508 「ここでやっている」って事なら同意。
これはC言語が入門用に勧められてるのが原因じゃないのかな?
C言語に始まりC言語に終わるってのが現状だし。
ビジネスアプリな人はCに戻ってこないけどねw
入門用というのが勉強用。 ビジネスアプリというのが 実用的なアプリということなら同意。
>>498 キーワードではないと思う。演算子もキーワードではないでしょ。
512 :
デフォルトの名無しさん :03/04/22 20:01
コンパイルに15分もかかってしまうんですが。そんなもの?
マシンとモノによる 昔Xフルビルドすると一晩掛かったもんだ。
>>512 コンパイラにもよるけど一般的にコンパイル速度を上げるには、
・コンパイラが使えるメモリを増やす。
・極大な関数があるなら分割する。
・(C++なら極悪なテンプレートは避ける)
・最適化を省略する。
・Makefileを使っているなら無駄なコンパイルをしてないかチェックする。
といった辺りをチェックしてみてはいかがでしょうか。
>>512 高いマシンを買って-O2オプションを付けてコンパイルすると幸せになれるよ
BCの話だけど
>>514 > ・極大な関数があるなら分割する。
ためしに数万行もある関数をコンパイルしたらVC++がフリーズしたっけな。
> ・(C++なら極悪なテンプレートは避ける) STLは見逃して
518 :
デフォルトの名無しさん :03/04/22 20:37
double **u; の**って何です? 検索しようにもアスタリスクは検索演算子として見られてしまって検索できません。 強化版ポインタか何かですか? 教えてくださった方には山梨県を差し上げますのでどうかお願いします。
正しい括弧付けかを判別するプログラムを教えてさい。 例えば (()())は正しく )()(や(()))みたいに正しく括弧付けされてないものは誤りである といったようなことを判別するプログラムを書きたいのですが…
>>519 今ぱっと思いついたのは
1.数えてる途中で')'の数が'('の数を上回らない(同じ数になるのはOK)
2.最終的に'('の数と')'の数が等しい
を満たしてりゃいいんじゃないの?
>>519 この間それにつかえるアルゴリズムを勉強したでしょ?
>>519 再帰関数を使うと言う手もある。
・文字列に対する参照ポインタを用意する。
・文字列を回して最初に)がきたらエラーを返す。
・最初に(が来るなら参照ポインタを文字列をそのまま自分に放り込む(再帰)
・再帰から抜けたあと、)が無ければエラーを返す。
でも
>>520 さんの方がスマートかな?
マルチにレスすんなよ
>>524 コンパイラ屋さんとかを目指すならこっちだけどねぇ
==が正しいかとか他の構文解析も追加しやすそうだし
スタックが64バイトしかないの。
>>519 '(' が出てきたら、 count++;
')' が出てきたら、 count--;
途中で count<0 になったら正しくない。
最後まで読みこんで、 count!=0 だったら正しくない。
"〜"、 '〜'、 /*〜*/、 //〜\nの間はカウント停止。
>>479 保証されてないと無茶苦茶困ると思うが。
>>485 calloc/malloc してる所は他にないのか ?
バグでメモリ管理領域が壊されてるに、一票。
>>519 マルチはやめてね。むこうに、
>>520 と同様のアルゴリズムで書いといたから見といてくれ。
>>524 単に括弧の対応だけなら、
>>520 でいいとおもうけど、括弧の中を解釈する必要があるようなら、再帰の方がいいかも。
最後の行はオプショナル
文字列処理が熱いね、簡単なパズル何だけど解答例が複数出たりする。
いっそスクリプト言語開発できるくらいにはなって欲しいね
>>519 でもマルチはダメだよ。
>>487 unlimitしてもallocに失敗したんですが、最適化オプションを
外してビルドしてみたらうまくいったようです。
ただ、コードを眺めてみると作りかけの関数を無理やり
呼び出したり、引数がおかしかったりと、コードそのものが
バグだらけなので、その辺を解決しないことには始まらない
話でした。お騒がせしました。
>>530 仰る通りです。バグつぶしに勤しみます。
536 :
デフォルトの名無しさん :03/04/22 23:55
scanf("%[0-9]","0123456789abcdef"); を scanf("%[*]","0-9","0123456789abcdef"); 見たいにしたいのですが、うまくいきません。 scanf("%.*s",5,"0123456789abcdef"); みたいに整数値ならできるのですが。正しいやり方を教えてください。
できないコードを示されて「こうしたい」と言われてもな。 何がしたいんだよ。 0桁から9桁の整数値を変換したいってのなら「scanf()単独ではできない」と答えておくが。
>>533 親切に検索語までお教え頂き、真にありがとうございます。
あとはそれを手がかりに道を模索する事にします。
山梨県は差し上げますので、今後自由にお使いください。
>>536 こういうことならできるけど。
#define REGION_DIGIT "0-9"
char str[128];
sscanf("0123456789abcdef", "%[" FORM_DIGIT "]", str);
puts(str);
エスケープシーケンス \v (垂直タブ) はANSI 規格のはずなのに Windows2000+cygwin では垂直タブの変わりに変な記号が表示されます。 何が悪いのでしょうか。
お答えありがとうございました。
>>537 エラーチェックを含めた入力関数を作りたいのです。例えばこんな感じです。
void GetsForOk(char*message,char*errorCheck)
{
char s[256],s2[256];
for(;;puts("入力エラー。やり直し"))
{
puts(message);gets(s);
if(!strlen(s))continue;
sscanf(s2,"*",errorCheck,s);
if(!strcmp(s,s2))break;
}
}
>>539 マクロならできるのですか。ただ、()が無いと言うエラーになってしまいます。
キーワードを元に調べてみます。
>>542 Real programmers don't use `for`.
>>542 ごめん。FORM_DIGIT は REGION_DIGIT に変えて。
名前に悩んでたら混ざっちゃった。
>>543 戻り値タイプのほうがいいのですか?
>>542 のだと1発でできるので楽かと。
他にいい方法があるなら教えてください。
>>544 なるほどそうでしたか。名前が違うのは何でだろうと思ってました。
直したらできました。ありがとうございました。
>>543 は、なぜforを使うなと言ってるのか聞きたい。
548 :
デフォルトの名無しさん :03/04/23 05:31
小町算に興味を持ち、プログラムを作成してます。 現在、式文字列の生成は完了して、演算部分の作成を行ってます。 で、質問です。 "1+2/3*4+557+89" の様な文字列の計算結果を求めるのに簡単な手法は有るでしょうか? lex,yacc 等は使える環境にありません。 要素単位にばらして順次処理するしか無いかなぁ...
a 数字と括弧(cを使って)を処理する b aを呼び出して掛け算と割り算を処理する c bを呼び出して足し算と引き算を処理する これでできると思うけど。
550 :
名無し@沢村 :03/04/23 08:03
おまいらよ、すべての変数はグローバルにすべきだよ。 ふつーグローバル変数はどこからアクセスされるかわからないから危険だといわれるが、 危険性はまったくないよ!! おまいらよ、考えてみろよ、グローバル変数がネットで公開されているのか? そして不特定多数のネットユーザーがグローバル変数に勝手にアクセスするとでもいうのか? そんなわけはないだろ!! グローバル変数なんて開発環境の中にしかなくて、そのプログラムを開発しているものしか使わないんだから、 勝手にアクセスされて危険ということはねーんだよ!
552 :
デフォルトの名無しさん :03/04/23 08:10
HeapやStackを中級車はやたらと多用したがるが、特にHeap変数はバグの
根源だし、Stackも同様に使い過ぎは毒
よって
>>550 にも一理あり。
>>550 世の中絶対ということはない。
スーパーハカーならネットワーク経由でグローバル変数に不正アクセスできるかもしれない。
書いていて情けなくなる(鬱
555 :
名無し@沢村 :03/04/23 08:35
>>554 いや、スーパーハカーでもネットにもLANにも接続されていないPCで開発を行なえば不正アクセスはできないよ。
電話線とモデムを失念しているようだな
甘い。CPUやメモリ等が発生するノイズが電線に回り込み、それを 解析すれば、CPUが実行している命令を解析出来るらしい。 起動時から全部チェックすれば、スパイ位は出来るらしい。 (ウソ)
558 :
名無し@沢村 :03/04/23 08:52
>>557 甘い。電線にも接続されてない充電式のノートPCで開発を行なえば、不正アクセスはできないよ。
沢村って誰?ま、いいけどさ。 グローバル変数の危険性は自分が馬鹿をやる可能性があるということ。 それからコンパイラの最適化がしずらくなる可能性がある。 まあ(DISK版)N88BASICでも一生やってなさいということで。
ちょっと聞きたいんですが、 strcmp とmemcmp の違いってなんスか?? どなたか教えてくだせぇ・・・
藻前ら、沢村なんかに釣られんなよ…。
>>560 その前に、あなたが調べた事を書いて下さい。
G(o^−^o)gle <検索しようね
ぐぐれば分かるさ よく説明を読め
>>560 せめてstr"n"cmpとの違いは?にしようよ。。。
>>548 小町算・・・前に2行で書いたらソースが滅茶苦茶汚くなったなぁw
569 :
デフォルトの名無しさん :03/04/23 14:59
WindowsのVCでコンパイル・実行できたプログラムをUNIXに移すと、 gccでコンパイルはできるんですが実行するとSegmentation faultが出てしまいます。 原因はどんなものが考えられるでしょうか。
570 :
デフォルトの名無しさん :03/04/23 15:00
>>569 文字列定数("で囲まれたやつ)を書き換えていないか?
バグがある
>>571 正解。
あと二度freeもVC++では落ちなかったような・・・
やりたかったことができました。
>>539 さんのマクロをヒントに関数そのものをマクロに
したらうまくいきました。ありがとうございました。あと、sとs2が逆でした。
sprintfは(s,"%s",s2)s2をsだったので、そのまま使っていたのですが、
sscanfは(s,"%s",s2)sをs2にだったんですね。
#include <stdio.h>
#include <string.h>
//Gets+ErrorCheck MSG:入力を催促するメッセージ SSM:書式指定文字列
#define GETSPP(MSG,SSM) for(;;puts("入力エラー。もう一度入力して下さい")){puts(MSG);gets(s);if(!strlen(s))continue;sscanf(s,SSM,s2);if(!strcmp(s,s2))break;}
int main(void)
{
char s[256],s2[256];
GETSPP("数値を入力して下さい","%[0-9]");
return 0;
}
> if(!strlen(s)) if(*s)でいいじゃん。
#include <stdio.h> int main(void){ int* a; *a = 5; int b = 4; printf("%d\n",(*a)+b); return 0; } ↑これでコンパイルはとおるけど、実行させたら Segmentation fault (core dumped) とかでます。 *aでint型のポインタの実体を指しに逝ってるから いけると思ったんだけど・・・
*a ではなく a の値はナニよ? つまりint型へのポインタ変数 a はナニを指しているかという
>>566 なるほど、算術記号が無くなるまで文字列を変形させる訳か。
バッファを大きめに取れば実数対応できるかな?
参考になりました。
>>574-575 なるほど。getsで何も入力しないで改行を押すと先頭に'\0'が入るから
*sは先頭の値を指すので、ぴったしですね。使わしてもらいます。
>>576 *a=5;の前にa=malloc(sizeof(int));
ちなみにそれは文法違反になるはず。Cでは変数宣言はブロックの先頭にまとめる。C99は知らないけど。
>>575 ありゃ。。。スマソ 長さが0の時に真にするんだよな。。。
>>576 そんな風に使うんならポインタじゃなくていいやん。
int main(void){
int c, b = 4;
int* a = &c;
*a = 5;
printf("%d\n",(*a)+b);
return 0;
}
なら、おっけー。つまり
>>577 のいう通りなんだけど。
あるいは
>>580
要するに、ただ単純に、ポインターが解ってないだけやんか
584 :
デフォルトの名無しさん :03/04/23 22:27
0やNULLは偽ですけど、0.0は偽になるとは限らないですよね?
いや、なるでしょ? その前提で結構書いちゃってるけど。
>>585 VC++6.0では偽になったんですけど、保証されているのかなぁ・・・・
if (0.0 == 0x00) printf("equal (・∀・)"); で試すがよい。
>>587 0がdoubleに格上げ(?)されてイコールってことですか?
イコールになりました。
C++ではC++の本に偽になることを期待したコードがあるんで多分保証されていると思うんですけど。
とりあえず偽になると覚えます。
なんか変なこといっているな・・・・ 0.0は0をdoubleにしたものだから0と0.0は同じ・・・・同じということは0.0も偽となるか。
>>588 何故比較対称が0でなくNULLでもなく、0x00なのかということに着目するといいよ
if(! (int)0.0) printf("false (・∀・)");
>592 キヤストするならそりゃそうだろ。
>>592 intにキャストする必要は無い
0.0は偽
printfは使用禁止!と言ったらfprintf(stdout,...)にしやがったぜあの馬鹿。
禁止にした理由を言わないからだろこの馬鹿。
>>596 そうなんだ
内部的に int にキャストしてると思ってた
>>597 何で代用するのか指定しておかないからだろ、この馬鹿
windowsプログラムとかのソース見てると int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) っていうのがあるけど、これは絶対書かないといけないの?
>>601 コンパイルしてみそ
#include <stdio.h>
#include <windows.h>
int WINAPI WinMain() {
MessageBox(NULL, (LPCSTR)"(*・Д・)", (LPCSTR)"", MB_OK);
return 0;
}
printfでlong型の変数の数値を出力したいんだけどintにキャストしなきゃ駄目なの? intとlongでサイズが違う場合はオーバーフローとかが問題になると思うんだけど。
%ld
>>603 ぬ?printfのフォーマット指定にlong専用のものってあったっけ?
いつも%dしか使って無いからよくわからないけど
可変個の引数の場合は整数はみなintになるんじゃなかった?
>>606 intより小さい整数は格上げされるが、大きい整数が格下げされるわけではない。
printf()のマニュアルくらい読むべきだな。
printfのマニュアルじゃなくて可変個引数についての説明だと思われ。
printf()のマニュアルを読んでも判ることだろ?
#define ERRDEF (-1) みたいにdefine時の数値は()で括らないと問題あるの? よく言われる話だけど・・・ 既出だったらスマン
あります。
教えて下さい。 Win2000+cygwinでCの勉強中です。 質問 プログラムの実行時間を計測したいです。 ループ文等を変更して、実行時間がどう変化するか 調べたいです。 ぐぐってみたのですが、 プログラムのプロファイル(詳しい実行内容・時間)をとる gcc で -pg オプションつきで コンパイルして実行すると gmon.out というファイルができる. そこで gprof program-name これは、上記目的をはたすでしょうか? ほかに、これが良く使われる(一般的)というものがありましたら、 教えて下さい。よろしくお願いします。
614 :
デフォルトの名無しさん :03/04/24 15:28
初心者ですみません。 int a =3: int array[a]; のように変数分だけ配列の要素を作ることってできないんでしょうか?
>>613 ありがとうです!
やってみたら、時間が表示されました。
そのあと、色々なことが書かれています。
もうちょっと調べてみます。
>>614 int a = 3;
int *array;
array = (int *)malloc(sizeof(int)*a)
>>614 mallocはそのためにある。
int *array = malloc(sizeof(int)*a);
でもgccだと拡張機能(array of variable length)で
int a=3;
int array[a];
が通ってしまうのはヒミツだ。
619 :
デフォルトの名無しさん :03/04/24 15:39
>>610 四則演算時に困るからってのが一番の理由
たとえばクラスのテスト5科目の点数の配列があるとして
int *test = malloc( CLASSMATE * 5 * sizeof(int) );
とするならば
#define CLASSMATE 30 + 25 だとどうなるか?
30 + 25 * 5 * 4 だよね?
#define CLASSMATE (30 + 25) だとどうなるか?
(30 + 25) * 5 * 4
さてどっちが正しく処理されるでしょうか?
C言語でドラえもん作れや! ____ ./, - 、, - 、  ̄ ヽ ./-┤ 。|。 |――-、 ヽ | ヽ`- ○- ´ / ヽ | | - | ― | | | ´ | `ヽ . | |ヽ ∩ 人`、 _ | _.- ´ | .| \ | ⌒ヽ / \  ̄ ̄ ̄ ノノ \ | |´ | ̄―--―― ´ヽ _ /⌒\ \_ _/-―――.| ( T ) `l Τ( )  ̄ |  ̄ } | \_/ | 、--―  ̄| / FUCK YOU ぶち殺すぞ・・のび太・・・・!
あるCプログラムを vc++ からビルド・実行、するとちゃんと実行できるのですが できた実行ファイルを直接実行しても何もおきません、 どこが悪いのか見当つきませんでしょうか。
>>622 プログラムの一番最後にgetchar();を書く。
>>621 感動で泣けよガキ
#include <stdio.h>
#include <windows.h>
int WINAPI WinMain() {
MessageBox(NULL
, (LPCSTR)(" / ̄ ̄ ̄ ヽ\r\n"
" __ /ヽ)―- 、 l\r\n"
" ,―γ ___ヽー、 q`´ハ ミ ヽ }\r\n"
" | ̄ ̄| | |(/),(ヽ)| | ̄ ̄| <_))_, | /\r\n"
" | ヽ (6 ー ) ノ | ヽ ___/_ノ\r\n"
" -――  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄――- (t) ̄ ̄ ̄|\r\n"
" | ,―  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ― 、 | (/_ )/ / |\r\n"
" | | | | ( ) ○ |-o\r\n"
" | | | | `ー―― ´\r\n"
" | | | |\r\n"
" | | | |\r\n")
, (LPCSTR)"", MB_OK);
return 0;
}
>(LPCSTR)"" なんでそんなコード書くの?
>>610 >>620 -1のような定数を括弧で括る理由の説明になっていない。
#define FOO -1
int a = -FOO;
#define FOOZ (-1)
int b = -FOOZ;
としたときに、前者はエラーになるが後者は正しく処理される。
何故ならば、それぞれ次のように解釈されるから。
int a = --1;
int b = -(-1);
>>627 ・・・言ってることが激しく620と変わらないのだが?
>>626 =628
適当発言に適当ソースで返した奴にまで一々煽るな
>>630 ()で括るのは式を定数化する為だという意味においてまったく違いが無い
1+1は式、-1も式
633 :
デフォルトの名無しさん :03/04/24 20:23
externについての質問なんですが、 === file1.c === int main(void) { int num = 10; func(); return 0; } === file2.c === extern int num; void func(void) { numをごにょごにょ } なにがおかしいんでしょうか?
634 :
bloom :03/04/24 20:26
int num = 10; int main(void) { func(); return 0; } === file2.c === extern int num; void func(void) { numをごにょごにょ }
int main(void) { int num; func(num); return 0; } === file2.c === void func(int num) { numをごにょごにょ }
>>606 intより小さいサイズの整数型・文字型の場合は、
int型と同じサイズに符号拡張され、スタックに積まれる、
が正解(だと思う)。積まれたデータをどう解釈するかは
関数次第だから、「みなintになる」はちょっと表現が
微妙と思われ。
反例:__int64とか、long longとか、昔のlongとかネ。
642 :
デフォルトの名無しさん :03/04/24 21:12
以下のように関数fooを呼び出して2次元配列を宣言し、 pに格納しようとしたのですが、コンパイルは通るものの 実行時にエラーが出てしまいます。どのように修正したら良いでしょうか。 よろしくお願いします。 int **foo(int a, int b); main(void){ int **p; p = foo(2, 4); } int **foo(int a, int b){ int **array = malloc(sizeof(int)*(a*b)); return array; }
>>642 エラーの内容を書かないという精神を修正したら良いんじゃないかな。
int **って二次元配列じゃないよ。
645 :
名無し@沢村 :03/04/24 21:37
おまいら、ちょっとC言語でプログラム書いてみろ? できたらおれが見てやるから、見せてみろ。
お前が書け。俺が見てやる。
char *GetBetweenString(char **betweenstring, char *str, const char *firststring, const char *endstring) { char *fpos, *epos; if((epos = strstr(str, endstring)) == NULL) return NULL; *epos = '\0'; if((fpos = strstr(str, firststring)) == NULL) return NULL; *betweenstring = fpos + strlen(firststring); return epos+1; }
>>642 そのコードだけだと特に問題ないと思うが・・・。
他の部分でアクセス違反とか起きてない?
>>642 #include <malloc>をちゃんといれてまつか?
漏れのBCCちゃんは通してくれますたよ。
mallocなんてヘッダーファイルはしらないなぁ。 malloc()はstdlib.hだろ。
あるよ。<malloc.h>だけどね。
>>655 標準じゃないからああいう言い方しただけだよ(^_^;)
VC++には.hのつかないのはないな。C++用か?
「問題が起きたため、○○.exeを終了します。ご不便をかけて申し訳ありません。
この問題をmicrosoftに報告してください。」というのがエラーメッセージの内容です。
>>644 あ、間違ってますか??最初int **以外で宣言すると
「間接参照レベルがint*int**で異なっている」とコンパイル時に警告が出たので・・・
>>649 うーん…mainで配列に数値を入れて出力するだけなんで
問題ないと思うんですが・・見直します。
>>650 ありがとうございます。読んでみます
>>657 ん?#includeは拡張子を省略できるはずだけど
できねえよ。
>>659 ためしに#include <stdlib>ってやったらインクルードファイルをオープンできないと言われたYO
>>658 Microsoftに報告しても解決しねーだろうな(苦笑
拡張子省略できるのは C++ の標準ヘッダファイルな
>>642 >「問題が起きたため、○○.exeを終了します。ご不便をかけて申し訳ありません。
>この問題をmicrosoftに報告してください。」というのがエラーメッセージの内容です。
多分OSはXPだろ?妙に過保護なんだよな…。
>>664 あれは省略してるわけじゃないぞ。
たとえば <iostream> と <iostream.h>は別物だ。
だね。書き方が悪かった。
>>632 いまさらだが...
> -1も式
ハァ ?
>>666 正しいんじゃないか?
g++ではstdioなんてファイルがないのに、#include <stdio>はOKだったぞ。gccではだめだけど。
Visual C++ 6.0ではC++としてコンパイルしようとしてもだめだけど。。。
>>668 ハァ?
じゃねえよ。正しいよ。お前が馬鹿。
>>642 GCCでコンパイルしてみて実行してみたが
問題なく動いたぞ。
main(void){
int **p;
p = foo(2, 4);
p[0][1] = 5;
printf("%d", p[0][1]);
}
無事5と表示された。
>>672 うーむ・・・まあ拡張機能はOFFにしなかったけど・・・
>>673 そりゃ「たまたま」正しく動いただけだ。
>>673 パパあのまま流用したらメモリリークだよ・・・
>>674 まぁ「正しい」の定義にもよるけど、標準Cの規則に準じてれば
正しいって解釈でいいよね。だったらg++の例は不適切。
おれがコンパイラつくって(作れないけど)独自に
#unko- <stdio.h>
でもインクルードできることにしてたとして、おれのコンパイラ
で動くから「正しい」って変でしょ?
0-1 という暗黙の展開があるから -1 という「式」が -1 という「値」として扱える でも何故か 4N という式は 4xN とは展開されない コンパイラは必ずしも四則演算の要件を満たしてるとは言えないね
int **pはポインタのポインタだろ。 p[a]はポインタになるだろ。 で、ここにきちんとint型のポインタを入れないといけない。
680 :
デフォルトの名無しさん :03/04/24 22:39
>>678 C言語と数学は違う。ただそれだけのこと。
>>680 の言うとおり。
ついでにC言語では4Nは式ではない。
int (*p)[5]=malloc(sizeof(int)*4*5);
4Lだと式だけどな(笑)
>>682 そりゃ正しいけどだめだろ。
>>642 はプログラム中で任意の列数・行数を持つ
2次元配列(もどき)を作りたいみたいだから。
>>680 四則演算という規格について言ってるのだから数学云々は別
>>642 int **foo(int a, int b){
int i;
int **array;
array = malloc(sizeof(int)*a);
for(i=0;i<a;i++)
array[i] = malloc(sizeof(int)*b);
return array;
}
int a=7,b=10,i; void *p1=malloc(sizeof(int)*a*b); int **p2=malloc(sizeof(int *)*a); for(i=0;i<a;i++) p2[i]=p1+i*b; できないかも。
できないな。void *じゃ加算できないって。
int a=7,b=10,i; int *p1=malloc(sizeof(int)*a*b); int **p2=malloc(sizeof(int *)*a); for(i=0;i<a;i++) p2[i]=p1+i*b; こうかな。
690 :
デフォルトの名無しさん :03/04/24 23:28
ファイルの指定位置から数バイト消すみたいな関数ありますか? 書くのは一杯知っているのですが。あるなら教えてください。
>>690 メモリに取っておいて切り詰めたい始端終端を取ってリワインドして
あとはガリガリってのではダメ?
>>691 それは今使っているやり方なんです。fprintfやfgetsで空入力しても
そのバイト分が消えて、空白や改行の2バイトに変わるだけですし。
>>693 Cはそれほど詳しく無いから分らないけど
ファイルシステムの構造を考えると切り詰めるってのは無いと思う
バッファサイズが気になるならtempファイルを作ってリネームでとか
ごめん、この程度しか思いつかん
>>693 ファイルの途中を切り詰めるという関数は標準C(およびPOSIX)にはありません。
システムコールでも * 不 可 能 * です。
末尾を切るのならあるだろうけどなぁ。。。truncateとか。 残す部分だけメモリーに取って上書きじゃ嫌なんだっけ?
お答えありがとうございました。
>>697 不可能なんですか。残念です。
>>698 今までは予め上限を決めておいて、セーブロードの時全てのデータを出し入れ
していたのですが、新しく作ろうとしている時そういえばあったっけとなってしまったわけです。
残す部分だけのは嫌ではないのですが、消す方法があるならそのほうがいいので質問しました。
700ゲット(^^)
なんか自分で考えてるうちに何がなんだかわからなくなってきたので 誰か愛の導きをください。 char *(string[32]); 0 ポインタ 1 ポインタ 2 3 ... 31 というようにポインタを入れる32個の配列が確保される、ですよね? では、char (*string)[32]; この場合はどういう事になるんでしょうか? 前者は、char* string[32];と考えてやればうまく掴めますが、後者がわかりません。 char型の宣言なので、例えば (*string)[0] 文字 ... (*string)[31] 文字 って事ですかね。 なんか頭の中にメモりの図が描けません。
>>701 char (*string)[32];
char[32]を指すポインタ。二次元配列を指すポインタとでも覚えておけばいいよ。
char *string[32]は配列だけど、char (*string)[32]は配列じゃなくてポインタ。指すものが配列。
すいません。。。 なんか余計わけわからなくなりました。 これを2次元配列として利用するとしたら、具体的にどんな書式で書くのでしょ うか?
>>704 void func(char (*string)[32]) // void func(char [][32])でもいいけど
{
// 何か
}
int main()
{
char a[10][32];
func(a);
return 0;
}
× // void func(char [][32])でもいいけど ○ // void func(char string[][32])でもいいけど
%s, %d のように %記号 で表現するスタイルについて、用語がついていたと思うのですが、 どういう名前か教えてください? 手元の本には記述が見当たらなかったので。
printf()系の書式、scanf()系の書式
>>707 フォーマットじゃなくて%dとかの規格の名前ってこと?
激しく今更だが、
>>627 には適当なことを書くな、と言いたい。
>>711 --1じゃなくて- -1ってことのほかに何かある?
(課題1) 1000以下の正の整数値のうち,素数をすべて計算し, その結果をファイルに格納するプログラムを作成せよ. 素数とは自分自身と1以外の数値で割り切れない整数のことである. また、計算の実行の中で乗除(乗算と除算)を行った回数もあわせて表示し、 ファイルに格納すること おねがい!!たすけてえええ
微妙にスレ違いかもしれませんが質問させてください。 Microsoftの日本のWebサイトの、MSDNライブラリの中には、C標準関数のリファレンスはないのでしょうか? もし有るのでしたらアドレスを教えていただけないでしょうか?
716 :
デフォルトの名無しさん :03/04/25 17:55
100+(0.000001)×1000000=100 (0.000001)+100=109.95… なんじゃこりゃ???
>>715 互換性のところにANSIと書いているのが標準関数なのでは?
720 :
デフォルトの名無しさん :03/04/25 21:48
100+(0.000001)×1000000=100 (0.000001)×1000000+100=109.95… だった。 両方とも110になるはずなのに、なぜだ?? 教えてください。
実数演算じゃないだろ。
100+(10^-6)*(10^6)が110になるわけないやん。
>>720 全角で書くのはどういうことだ? 試させない気か?
問題は実数演算じゃないよ。
floatで定義してるんです、これ。 それが関係してると思うのですが…
有効桁数の問題かな。
>>720 上は桁落ちを起こしてるんだろうけど、下はなんだろ?
てかこの程度で桁落ちしたっけ?>float
>>730 OSはLINUXで、コンパイラは分かりません!
>>732 分からないってことはないだろう。
CPUはIntel系(32bit)、コンパイラはgccか?
あー、、浮動小数点数演算の誤差の話か、、、、
735 :
デフォルトの名無しさん :03/04/25 22:59
>>729 float? doubleじゃなくて?
x(0.000001)(1000000)(100)*+= どっちもこう展開されると思うんだけどなぁ・・・
floatは何桁まで取れるんですか?
>>737 倍密度浮動小数点数なら桁落ちはまずない(単密度と比べて)
>>720 下はあまりにも誤差が大きすぎる。
どうやって表示したの?
お前ら、情報処理技術者試験(基本情報技術者試験)を受けれ。
同じような環境でどうやっても101.000000...になる・・・
>>742 そういう君は持ってるんだな?下の原因を教えてくれ
#include<stdio.h> main() { float a,i; a=0; for(i=1;1<=10000000;i++) a=a+0.000001; a=a+100; printf("%f",a); } …確かこんなかんじです。
・・・・・。ループで足していたのかよ・・・・
これはまた誤差が出まくりそうな…
>>746 君のソースにループカウンタへの愛を感じない
まぁマテ、お前らの中で
>>738 を理解している奴がどれだけいるのか確認したい
これに関連するある国の名を挙げてくれ!
じゃなくて、 無限ループかよ!
>>749 一生ループしまくりだから、愛してるんじゃねーの?
iに直してやってみたら、また109.592110という結果でしたー
>>752 i の恋人は int と決まってるの!親がそう決めたの!
int じゃないといかんのですか?
あたしの親も float みたいなかぶいたやつとは付きあわせない といってました。
floatの有効桁数は6桁
Real programmers don't use float type.
FORTRANの掟 先頭1文字目がI,J,K,L,M,N → 整数型 先頭1文字目がそれ以外 → 実数型
765 :
デフォルトの名無しさん :03/04/25 23:26
僕もC言語勉強してロマサガ2みたいなすごいゲームをつくります(^O^)/
値の極端に小さい実数同士を演算し、有効桁数を越えた部分が無効とされること
>>738 はスルーかいw お前ら勉強してないだろ?
>>767 おぉ、なんとなく分かるかも。
ありがとうございました。です。
ぎゃくぽのことか?
整数部の大きな数と小数部の大きな数同士で計算した場合の誤差はなんと言うんだっけ。
情報落ち 情報落ちとは、大きな値と小さな値を加減算したときに、小さな値が無視されてしまう現象のことです。 コンピュータで扱う浮動小数点では、仮数部に保持できる桁数があらかじめ決められています。そのため、 大きな値と小さな値を加減算すると、有効な数字をもった桁が多くなりすぎるため、正規化する際に 下部の桁が切り捨てられてることになります。
779 :
デフォルトの名無しさん :03/04/26 00:08
C言語の基礎を学びたいのですが2日ほどで覚えられますか? ○×ゲームくらい作れるようになりたいのですが。
>>778 YES
アスキーやe-wordsのオンライン辞書には載ってないんだな
合格情報処理の付録の辞書にさえ載ってるのに
二次元の配列をmallocで割り当てるにはどうやればいいですか?
○×ゲームの7行ソースきぼんぬ
>>782 //mallcoは確保したメモリの先頭ポインタを返すんだよ。
//つまり、自分でオフセットとって二次元配列の様に扱いなさいってこった。
int head = 3;
int len = 5;
int *arg;
arg = malloc((head * len));
//これでarg[head][len]の様に自分で扱えば良い。
free(arg);
//分ってなさそうだから参考までにforループsample //0で初期化(ZeroMemory使えって突っ込みはいらない) int i, j; for(i = 0; i < head; i++) { for(j = 0; j < len; j++) { arg[(i * len) + j] = 0; } } //arg[(i * len)][j]だと思え。
for(;;) printf("ヴァカですか?\n"); while(1) printf("アフォですか?\n");
(^^)
>>784 どうやって多次元配列の各要素にアクセスするのか、その仕組みを勉強しなさい。
790 :
bloom :03/04/26 04:26
791 :
デフォルトの名無しさん :03/04/26 04:58
792 :
デフォルトの名無しさん :03/04/26 06:27
int main() { signed short x=-1; signed short z; z = sizeof(x); if ( x < z ) printf("aaa \n"); else printf("bbb \n"); if ( x < sizeof(x) ) printf("aaa \n"); else printf("bbb \n"); return 0; } ./a.out aaa bbb どうして、こうなるのですか?またならないようにする 対処方法は?
よく見ていないが、おおかたxがunsignedになって膨大な数になったからだろ。 釣りだろうな。
int main() {
signed short x=-1;
unsigned short y;
signed short z;
z = sizeof(x);
y = sizeof(x);
if ( x < z ) printf("aaa \n");
else printf("bbb \n");
if ( x < y ) printf("aaa \n");
else printf("bbb \n");
if ( x < sizeof(x) ) printf("aaa \n");
else printf("bbb \n");
return 0;
}
./a.out
aaa
aaa
bbb
>>793 無論、釣りですが、説明がつきません。
>>794 signedとunsignedを比較するとsignedの方はunsignedになる。
sizeofが返す型はsize_tだからunsignedでしょ。
796 :
デフォルトの名無しさん :03/04/26 08:42
>>795 では、
>>794 の下の部分は、どう説明するの?
> unsigned short y;
> if ( x < y ) printf("aaa \n");
#include <stdio.h> int main() { signed short x=-1; if ( x < sizeof(x) ) printf("aaa \n"); else printf("bbb \n"); if ( x < (unsigned short) sizeof(x) ) printf("aaa \n"); else printf("bbb \n"); if ( x < (signed short) sizeof(x) ) printf("aaa \n"); else printf("bbb \n"); if ( x < (signed int) sizeof(x) ) printf("aaa \n"); else printf("bbb \n"); if ( x < (unsigned int) sizeof(x) ) printf("aaa \n"); else printf("bbb \n"); return 0; } これやってみりゃわかるだろ?
798 :
デフォルトの名無しさん :03/04/26 11:55
C++を利用してCコンパイラを使う方法がわかりません。誰か教えてください!! 自分で出来たのはvcvars32を自ディレクトリにコピーするところまでです。
>>798 逆ならできるよ、下位互換するシステムなんてそうそうない
>798 vcvars32[.bat]はCやC++自体とは何も関係がないだろ。 何で敢えてコマンドラインでやろうとするの?
801 :
デフォルトの名無しさん :03/04/26 14:15
質問です。 srand(time(NULL))で初期化してrand()で乱数を取得したのですが 複数のプログラムを動かすときに、同時に起動してしまうと rand()がすべて同じ数になってしまいます。 別々の乱数にするにはどうしたらよいのでしょうか。
>>801 timeが返す値は秒単位だからね。
システムにもっと細かい精度で時間を得られる関数があればそれを使ったら?
804 :
デフォルトの名無しさん :03/04/26 14:30
805 :
デフォルトの名無しさん :03/04/26 15:30
itoa(int,char*,int) の第一引数と第三引数の意味を教えてください。
標準ライブラリにはそんなものないんだが。 変換対象と基数か?
>>805 itoa, ltoa, ultoa - 整数の文字列への変換
書式
#include <stdlib.h>
char *itoa(int val, char *buf, int radix);
char *ltoa(long val, char *buf, int radix);
char *ultoa(unsigned long val, char *buf, int radix);
解説
itoa(), ltoa(), ultoa()はvalを文字列に変換してbufに格納します。radixには2から36までの整数で変換の基数を指定します。
itoa()とltoa()はradixが10のときにはvalを符号付き数として扱います。それ以外では符号なし数として扱います。
ultoa()はvalを符号なし数として扱います。
リターン値
bufに渡された値をそのまま返します。
>>806 > 標準ライブラリにはそんなものないんだが。
↑初耳だ(ワラ
ん?C99には追加されたのか?
キャスト関数は昔から
atoi と勘違いたとか。
>>807 わお、すばらしい。
ありがとうございます。助かりました。
確かに数値>文字列の処理はCには無いとの文献も見当たりますね C99かC++のライブラリに追加されたんじゃないかな? んで、実装自体はCの関数だから下位互換が可能と。
あ、sprintfは別個ねw <数値文字列変換
816 :
デフォルトの名無しさん :03/04/26 16:35
ANSI-Cの関数の一覧が乗っていたページを忘れてしまったのですが、 アドレスを教えてください。確かピンクっぽい色で、ヘッダごとに見れたと思います。
>>817 そのページはなくなってしまったんですか?載せていただいたアドレス
は別にブラクラでは無いですが、希望したページと違いますが、いただきます。
ありがとうございました。
fgetc、fgets、fscanf等で標準入力から入力(リダイレクトなどはしないで、キーボードのまま)するとき、 キーを押してもそのまま入力されるわけではなく、 一度画面上で編集(MSDOSプロムプトなら^Hで1文字削除、NT系ならさらに高度な編集機能) されてから渡されるのですが、 この入力システムはどこのプログラムが提供しているのですか? デバイスドライバとかですか?
>>819 FILE *stdin だからデバイスだろうねぇ
821 :
デフォルトの名無しさん :03/04/26 22:42
ヘッダーファイルの#endifとか#ifdefとかって何ですか
823 :
ろりえおーばーないとせんせーしょんだんさーりこん :03/04/26 22:46
NULL PO ?
>>819 端末ドライバ。UNIX(SysV)では STREAMS
NULLの方が良かろう。 ポインタだと分かる。 よって否定派。
ぬるぽの内部表現が 0 にならないことがあるっていうのと 混同しているんでは。内部表現がどうあれソース表記上は 0 (NULL)でなければならなかったような。
>>823 そのページみたけど、
>> 有名なC言語FAQ日本語訳 の質問5.17に NULLポインタに 0以外が割り当てられ
>> てる機種があることを知って以来、 "NULL"と表記するように心掛けてきた私にとっ
>> てはセンセーショナルでした。
こいつなんか勘違いしてるんじゃないか?
NULLポインタのビット表現がオール0じゃない機種だろうと、
0("NULL")はNULLポインタなんだが
Stroustrup が 0 と書くのを勧めてるのが事実なら、
単にC++が糞なだけな気がする
831 :
ろりえおーばーないとせんせーしょんだんさーりこん :03/04/26 23:03
NULLの人より0の人が多いみたいですね。 でも、猫ちゃんとかよく見るソースにはNULLが多いですねー。 NULLというものも知っておけということでしょうか。 ありがとうございました。
>>830 NULLがリテラルの0じゃない処理系があるってことだろ。
だからNULLは定義してあるヘッダーを インクルードするのが面倒だから 俺は使ってないっていってんだろ! 何言ってんだ!
835 :
ろりえおーばーないとせんせーしょんだんさーりこん :03/04/26 23:05
>>830 C++が糞に見えてくるすばらしい言語を教えてください。
837 :
ろりえおーばーないとせんせーしょんだんさーりこん :03/04/26 23:10
838 :
デフォルトの名無しさん :03/04/26 23:10
すいません。どなたかちょこっとおしえてください。 .NET Microsoft Framework SDK で、C言語のソースを コンパイルする方法(コマンド等)を教えてください。
>>833 どういう意味?
#define NULL 0xdeadbeaf
とか0以外になってる処理系があるってこと?
>>839 たとえば(void*)0になってるとか。
>>838 CL, BCC32, CC, JAVACのどれか
ふーむ Stroustrup は、NULL が (void *) 0 になってる処理系があるので、 NULLポインタを使いたいときは、0 を使えっていってるの? へんなの
アロエリーナ、絶対にアロエリーナ
>>844 「C++は型チェックが厳しいから0を使え」みたいな言い方だったような。
>>844 int *p=(void *)0;
これはコンパイルできるか?
>>847 Cなら出来るんじゃない?キャストしないと気持ちわるいけど
>>848 C++では出来ないから0を使うということで 終わり。
void* をキャストなしで他のポインタに代入できない仕様になった時点で NULL の定義も 0 とするように決めておけば良かったのにな。
NULLテンプレートにすればよかった
NULLをキーワードにしちゃえよ
ヘッダのインクルードにやたらとこだわっている人がいるな(w
855 :
デフォルトの名無しさん :03/04/27 00:11
>>841 さん、ありがと。
cl コマンドででできました。
JAVACにツッコミが来なかった・・・もう来ない・・・
857 :
ろりえおーばーないとせんせーしょんだんさーりこん :03/04/27 00:29
僕の心は揺れています。 1/f
VC++5or6中古買いたいんだが、ヤフーオークションめんどくさい だれかお助けを!
>>858 お前のタイーホの共犯になれとでも?断る。
>>858 もう一度よく考えるのです。
ほんとうにVC++が必要なのか。
861 :
デフォルトの名無しさん :03/04/27 01:28
include<stdio.h> void main(void) { int fuck; fuck=0; printf("%d"fuck); }
862 :
デフォルトの名無しさん :03/04/27 01:32
あのさ、CでGUI作れるの? 何かの本でC++はCの進化系だと書いてあったんだけど。 それとC++ってわざと難しく創られたって本当?
多分多くの処理系で #ifdef _cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif と定義されていると思うけど。
MS-DOS時代でもGUIとかマルチタスクはあったんだよ
865 :
デフォルトの名無しさん :03/04/27 02:13
そうだったんですか・・・
>>863 (void *) 0 使ってるのってどの処理系?
普通は、#define NULL 0 でしょ?
ちなみに Solaris8 では、こんなんだった
#ifndef NULL
#if defined(_LP64) && !defined(__cplusplus)
#define NULL 0L
#else
#define NULL 0
#endif
#endif
868 :
スレッド直リン :03/04/27 02:46
>>866 VC++ とかだろ
[VC++6 の stdio.h]
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
あー名前が・・・・
871 :
ろりえおーばーないとせんせーしょんだんさーりこん :03/04/27 04:06
#define NULL ((void *)0) define って、キャストしない場合は int なんでつか?
プリプロセッサ命令に型などない。
874 :
デフォルトの名無しさん :03/04/27 04:22
C初心者、勉強中です BCC5.5を BCC Developer(フリー)で使っているのですが・・。 このBcc Developerについて 何処か良い説明載ってるトコご存知ない?
>>871 int define;と定義すればintだし、char *defineと定義すればchar *
876 :
デフォルトの名無しさん :03/04/27 04:29
なぜNULLを予約語にしませんか?
× 大文字 ○ 全部大文字
>826 てことは、fgetc等でのキーボードからの入力では、履歴機能や挿入入力とかは((システム側に)用意されてなかったら)使えないのですね。
>>879 履歴とか使いたかったら、gnu getline使え。
OSで持っている訳ではない。
但しこれはLGPLではなくGPLなので、プログラム全体が
GPLに矛盾しないライセンスになるので注意。
似たようなライブラリで、BSDライセンスのも有るが、俺は使った事無い。
>880 それは違う
882 :
デフォルトの名無しさん :03/04/27 11:23
hです。 制すうちを入力しshort型の変数に格納した後 この変数の内部表現をビット列で表示するプログラムを作成せよ・・・ という課題がでました。 integer=>1 0000000000000001 integer=>-2 1111111111111110 といった感じで表示するってとこまでは分かったけど・・・ 実際のプログラムが分かりません。助けてください・・・。
>>883 > なんか、最近何度も見た気がするのは気のせいだろうか…
同じ学校とかじゃねーのかな ?
885 :
デフォルトの名無しさん :03/04/27 11:52
scanf()って基本的に使わないんですか?
??=とかの3連文字はちゃんと習得しておいた方がいいのでしょうか?
887 :
デフォルトの名無しさん :03/04/27 13:16
どなたか教えてください。 C言語の本で、実際に実用に使えるような完結したソース を扱っているC言語応用編みたいないい本はないでしょうか。 練習用の小さなソースだけでは力がつかないような気がしたので、 どなたかちょこっと教えてください。
889 :
デフォルトの名無しさん :03/04/27 13:26
Cをやっているのですが、どんなプログラムが書ければ 脱初心者になれるのですか?おながいします。
>>889 そんな質問をしなくなれば、脱初心者だ。
891 :
デフォルトの名無しさん :03/04/27 13:48
行列の要素が何個あるかを調べる関数はありますか?
あ、まちがえました。 行列じゃなくて、配列でした。 ありますか?
>>894 #define yousosuuhaikutsudesuka(array) (sizeof array/sizeof array[0])
適当に括弧を付けて。
>>895 ありがとうございました。たすかります^^
約、一週間が過ぎようといていますが、合計値を横に出すことが出来ても どうしても、すべて1と表示されてしまいます。ちょっと混乱して分かりません。 どなたか力を貸していただけないでしょうか?よろしくお願いいたします。 初心者ですみません。
fflush(stdin)には誰も突っ込まないんだな。
899 :
デフォルトの名無しさん :03/04/27 16:13
すいません、ちょっと質問したいんですけど、VCで インクルードファイルがオープンできませんってエラーが 出るんですけど、このときの設定はどうすればいいんですか?
コンパイラのインストール時の設定を見直す。
>>899 どこにあるなんというインクルードファイルがオープンできないのか判らないと
詳しいことは回答できないと思われ。
ついでに言えば激しくスレ違い。
>>897 #define MAX_ROWS 5
#define MAX_COLS 10
#include <stdio.h>
int main()
{
int table[MAX_ROWS][MAX_COLS];
int i,j,k;
int total;
for(i=1; i<=MAX_COLS; i++){
for(j=1; j<=MAX_ROWS; j++)
printf("%3d",j+MAX_ROWS*(i-1));
total=0;
for(k=0; k<MAX_ROWS; k++)
total+=MAX_ROWS*(i-1)+1+k;
printf("%4d\n",total);
}
return 0;
}
インデントの入れ方が良くなかったかな。 #define MAX_ROWS 5 #define MAX_COLS 10 #include <stdio.h> int main() { int table[MAX_ROWS][MAX_COLS]; int i,j,k; int total; for(i=1; i<=MAX_COLS; i++){ for(j=1; j<=MAX_ROWS; j++) printf("%3d",j+MAX_ROWS*(i-1)); total=0; for(k=0; k<MAX_ROWS; k++) total+=MAX_ROWS*(i-1)+1+k; printf("%4d\n",total); } return 0; }
int table[MAX_COLS][MAX_ROWS]; ではいかんのか?
コピペ→編集 してたから気づかなかったけど、 int table[MAX_ROWS][MAX_COLS]; は要らなかったな。
>>489 >>897 配列になぜいれるのかが分かりません。その機能を別の所
で使うのだと思うのですが。表示するだけなら↓。
#include <stdio.h>
#define PURASU 5
#define IKOHRU 10
int main(void)
{
int y,x;
for(y=0;y<IKOHRU;y++)
{
for(x=1;x<=PURASU;x++)printf("%5d",PURASU*y+x);
printf("%5d\n",(PURASU+1)*PURASU*10/20+PURASU*PURASU*y);
}
getchar();return 0;
}
>>886 欧州の方で、Cプログラマになるなら必要かもしれない。
908 :
デフォルトの名無しさん :03/04/27 20:20
red hat linuxですがgetche()を使うためのヘッダファイルがわかりません お願いします
>>908 curses.h
getchだけど多分同じだと思う。
>>908 getche()なんてものがあるのかw
getc, getch, getchar・・・もう分け分らん
コニ男さんでgetcheが使えるみたい
(^O^*)
Curses版、getch()w/echoだったっけ?<getche()
エコーバックのある getch() と覚えておけ
じゃあそのげっちぇのeはechoのe?
げっちぇ言うな
げっち、げっちぇ、げっちゃら
>red hat linuxですがgetche()を使うためのヘッダファイルがわかりません こーゆー質問を見ると、知りたいのは本当にヘッダファイルだろうか という疑念がわかないでもない
921 :
デフォルトの名無しさん :03/04/28 03:27
主に使うのはVC6とmingwなんですが、 memcpyと自分でforループ回すのって 一般的にどっちが速いんですか?
memcpy
923 :
デフォルトの名無しさん :03/04/28 03:54
>>922 ありがとうございました。
アセンブラの出力見て多分そうだと思ってましたが、
やっぱりそうですよね。
924 :
デフォルトの名無しさん :03/04/28 03:55
俺もmemcpyに一票つーか、何でforループの方が早いかもとか、思うのかが不思議。 同じことをするライブラリ関数に手書きコードが勝てること等ないと思った方がいい。
スピードなら俺の書いたqsortの方がVC++6.0のqsortより速い。
>925 で、代表値はどうやって選んでるの?
代表値ってなんだろ・・・・基準値なら真ん中。 再帰使っているから使い物にならないけどね。
うーん、間違って覚えてたみたい。 真ん中って、配列上の真ん中に位置する値ってことですか。 qsort の弱点克服の方法はないのかのー。
コードの冗長性&コストの無駄遣いならライブラリには負けない自信がある。
読みやすさなら勝てるかもー?
>>931 逆に最近チマチマしたチューンナップってやっちゃダメだと
分かっちゃいるけど、たまに書いてみたくなるよ。
933 :
デフォルトの名無しさん :03/04/28 06:07
Java->C Python->C 組み込むならどっち? Pythonで実現可能ならそっち選んだ方がいいかな?
また意味不明・・。 その矢印が表すものは何だ?
(*Java).C (*Python).C
937 :
デフォルトの名無しさん :03/04/28 15:34
たとえば fread(data,2,100,fp); は,配列data中に,2バイトずつ100個のデータを,fpから読み出す、 という意味になるかと思います。これを100個ではなくてfpの 最初から最後までという指定方法を教えてください。
>>937 fseek(fp,0,SEEK_END);
size = ftell(fp);
fseek(fp,0,SEEK_SET);
fread(data,size,1,fp);
(fp の最初ってファイルの最初なのかどうか分からないけど、) 答え出しちゃうと面白くないと思うからヒント fp の最初にとるべき位置と最後の位置を分からないと配列の長さが確定しない。 ファイル先頭から見て fp の現在位置を知る方法や、最後に移動する方法、 もしくはファイルサイズを得る方法が分かると、自ずからわかるんじゃない?
。゚(゚´Д`゚)゚。デヲクレタ
942 :
デフォルトの名無しさん :03/04/28 15:55
a = 30 + (0x15aa >> m & 1); これはどういうことですか? mは適当な整数ということでよろしくおねがいします。
ぱっと見、月の最後の日付をとりたいのかなぁ、と思った。 2 月が例外になりそうな気もするけど。
>>943 2月は別に作ってあるので大丈夫なんですが、
0x15aa >> m & 1 の意味がわかりません
うーん。机上でトレースしてわかってくれ。
0x15aa は二進では 1010110101010だよな。 m = 3だと、0x15aa >> 3 は、1010110101になる。 &1で、1。 m = 4だと、0x15aa >> 4 は、101011010になる。 &1で、0。 m = 5だと、0x15aa >> 5 は、10101101になる。 &1で、1。
>>946 トレースまでしてあげる貴方を優しいとオモタ。
>>942 mが偶数なら5576をaに入れる。
mが奇数なら2803をaに入れる。
おっと、>>の方が&より高いわ。 どうりで変な値になるわけだ。
どうでもいいけど、素直にテーブル使ったほうが速いよな。
>951 まぁ、そうなんですが、そのへんはツッコまないのがよろしいかと。
どうでもいいことだが、 & はむちゃくちゃ優先順位低いよ。 a & 0x01 == 0x01 は a & ( 0x01 == 0x01 ) と等価。
>953 それって、確か昔&&を&で代用していたころの名残なんだよね。
>955 (´・∀・`)ヘー ナルホドウ >953 さんではないけど、それは知らなかった。
>>944 > 2月は別に作ってあるので大丈夫なんですが、
28 + (0x3bbeecc >> 2 * m & 3) ってやれば、2月を別扱いしなくて済むぞ。
年を知らずに2月の日数を得ることは出来ない。
dayOf2 = 28 + (year % 4 == 0) ただし、year > 1900 && year < 2100
>956 ホントはもっと順位を上げるべきだったのだがその時点で既に大量のソースが あったので今更変更する(ことでどれだけの修正が発生するかと思うと)勇気がなかった。 とかなんとか、そんな理由だったかと。
>>961 2000年問題は、うるう年が問題ではないことも知らないのか?
あほでした。 400で割り切れる年は閏年でした
いつものパターンですな。
>>963 氏が潔いことを除けば。
>>962 条件つけてまでくだらん式を考えてないで
普通にちゃんとした式を出せばいいだろ。
どうせ今の西暦(グレゴリオ暦)が採用される前のデータなんか扱うわけないし、 2100年以降のデータも扱わないって言うなら100年400年ルールは考える必要がない。 そのくらいの割りきりも時には必要。
そう。そうやってどうせ使わないだろうという甘い考えからy2kの悲劇が起こった。 対応するのに膨大な手間がかかるのならまだしも、 すぐ近くにマトモな答えがあるのに、それを使わない理由など無い。
計算式を逆ポーランド記法に変換するアルゴリズムの方針だけでも教えてよ 例 1 + 2 * 3 → 1 2 3 * + stack , pop , tokenとかの関数は作ったからあとは変換するだけなんだけど よくわからんぽ
> 年のフィールドに数字が2桁しか入らないデータ構造って話と > 2100年以降のデータは扱えないプログラムって話を > 同列に語って意味があるとでも? 意味あるだろ。どちらも甘い考えが引き起こした。 先読みの甘さ。うるう年の計算をまともに実装しない甘さ。 > そもそも2100年以前に32bit限界(2038年問題)が発生するってば。 この場合のyearはint型だろ。話が違う。
972 :
デフォルトの名無しさん :03/04/28 18:32
C言語勉強してるんですが、 1Uって書くのと1と書くのではどう違うんですか?
符号無し。
まず、1U とか 1 って何型か考えてくれ。
975 :
デフォルトの名無しさん :03/04/28 18:41
期待age
977 :
デフォルトの名無しさん :03/04/28 18:45
>>977 1Uはunsigned intってことですか?
int:16bit 長のシステムがあったとしよう。 君は long (4バイト長)な変数 l に値 8000h を入れたいと思っている。 さぁ、どう書くの? その時に気を付けなければならないことは?
ウワーン! 例えば無しを間違えちゃ話になりませんなぁ。ゴメン!
int main() { return ( -1 < 1 ); } int main() { return ( -1 < 1U ); } それぞれどっちが返るか見てみたら?
>>974 値のコンペアをする場合に問題あるんだろ?
う〜ん、符号ビットの話かな すみません ちょっと用事で20分くらい離れます
1 < 0x80000000 と 1 < 0x80000000U の比較結果
次スレは…なしで!(w
ヘコんだ。
>>938 ,939
できました。
ありがとうございますた。
ume
tate
1000を撮ります宣言!
1000を取りま1000 1000言!
yoko
1024?
65535
まあ俺が1000なんだけどな。
1000撮った
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。