1 :
デフォルトの名無しさん:
2 :
デフォルトの名無しさん:2006/04/23(日) 22:36:15
2
3 :
デフォルトの名無しさん:2006/04/23(日) 23:09:30
今さらですが。
人生の先輩の皆さんはどのエディタ使ってますか?
弟にOSをリカバリされたのでちょうどいい機会なので他のエディタを使ってみたいです。
秀丸使ってるってやつの意見は無視していいから。
5 :
デフォルトの名無しさん:2006/04/23(日) 23:27:14
メモ帳に決まってるだろ!
どんなコンパイラだろうとVS使ってる
Meadow/emacs使っとけ
TeraPad
VZ Editor
vi/vim使っとけ
一通り出たかな。後は、この辺挙げておこうか。
xyzzy
桜エディタ
Peggy
GNOMEのエディタがまだ出てないな
>>6 俺もだ。SQL もバッチも、テキストというテキストはすべて。
ターゲットが Windows 以外のときも、makefile 手で書いて
カスタムビルドで nmake 走らせる。そこまでするほど VS。
で、たまに「ああもう!」と叫びながら vim 起動。
>>3 vim
いつも Linux ばかり使っているもので、つい。
16 :
デフォルトの名無しさん:2006/04/24(月) 20:01:11
VSのエディタが最強。
ここはVSを買えない貧乏人が集うスレ
^^;
Eclips
xyzzy一筋
もうこれからやるやつみんなVC++2005Expressでええやん
のんびり基礎やってるうちに次期バージョン移れるぞ
夕べfread関数を教えてもらったものです、
10 20 30 40 50 60 70 80 90
という連続したバイナリデータをファイルから読込んで
fooに2byteの1020h
foooに3byteの304050h
fooooには4byteの5060708090h
巧くいきません、出力の仕方(printf文)も曖昧なのですが、
それぞれ変数の先頭アドレスにfoo10hfooo20hfoooo30hと巧くいっていないのが
分かります(;^ω^)
fooに2byteの1020h
foooに3byteの304050h
fooooには4byteの5060708090h
と代入する方法を教えてくださいお願いします。
#include <stdio.h>
#include <dirent.h>
char foo[1];
char fooo[2];
char foooo[3];
int main(void){
FILE *fp;
if ((fp = fopen("hoge.exe", "rb")) == NULL) {
printf("file open error!!\n");
exit(1);/* エラーの場合は通常、異常終了する */
fclose(fp);/* ファイルのクローズ */
}
fread(&foo, sizeof(foo[1]), 1, fp);
fread(&fooo, sizeof(fooo[2]), 1, fp);
fread(&foooo, sizeof(foooo[3]), 1, fp);
printf("fooは:%xです\n", *foo);
printf("foooは:%xです\n", *fooo);
printf("fooooは:%xです\n", *foooo);
}
>>21 sizeof(foo[1])をsizeof fooに、foooとfooooも同じように。
2バイト確保するならchar foo[2];じゃねーの?
24 :
21:2006/04/24(月) 22:15:43
日本語が変でしたヾ(゚д゚;) スッ、スマソ
fooに2byteの1020h
foooに3byteの304050h
fooooには4byteの5060708090h
を代入する方法を教えてください。
25 :
21:2006/04/24(月) 22:42:13
>>22さん
どうもありがとうございます、配列の順番が揃ったみたいです
>>23さん
どうもです、馬鹿ミスでした
printf("fooは:%xです\n", *foo);
printf("foooは:%xです\n", *fooo);
printf("fooooは:%xです\n", *foooo);
としてみると
fooは:10です\n", *foo);
foooは:30です
fooooは:60です
となりましたが、変数fooに1020、foooに304050、fooooに60708090
とするには、どうしたらいいのでしょうか?
>>25 printf("foooは:%x%xです\n", fooo[0], fooo[1]);
27 :
デフォルトの名無しさん:2006/04/24(月) 23:20:36
28 :
21:2006/04/25(火) 00:44:20
>>26さん
どうもです、確かにそれで表示ができますね(;^ω^)
とこが実はこのプログラムの目的なのですが、バイナリデータをあるコードに
変換することが目的なのです、ある種のコンパイラの様なものと
理解して頂けたら幸いです、しかし、ここで問題が発生しました
foo[0]が00でfoo[1]が01の場合はhoge
foo[0]が01foo[1]が00の場合はhoghoge
を返すような関数を作りたいのですが、こんな場合
どのようなアルゴリズムを考えるべきなのでしょうか?
%x%xの書式で表すと0001も0100も同じ01と同じ結果になってしまう気がしますし・・・
バイナリデータをどのように扱っていいか思案しています、
皆様のお知恵拝借お願いします
ifとかswitchとか。
* char func_hoge(.const char * hoge_x)とかいうね関数を作りたいんだけど
中でmallocした変数って返していいんだっけ?
char *a = (char *)malloc(sizeof(char) * 255);
return a;
こいつを返していいんだっけ?関数ないで作成した自動変数ってそのスコープだけじゃなかったっけ?
どうなんだっけ?
a自体は捨てられるけどaが指すヤツ(mallocで確保したヤツ)自体は消えない
>28
>foo[0]が00でfoo[1]が01の場合はhoge
>foo[0]が01foo[1]が00の場合はhoghoge
foo[0]*256+foo[1]
ああそうかじゃあ、
char *b = hoge(....);
ってやったらfree(b)すればいいんだね。ありがとう
34 :
デフォルトの名無しさん:2006/04/25(火) 08:59:30
char buff[5] = "aiueo";
これってバッファオーバーフローしていますか?
36 :
デフォルトの名無しさん:2006/04/25(火) 13:23:08
してるよ
char buff[] = "aiueo";
なんでコンパイラに文字配列の大きさを計算させないのかを問いつめたい
いや、危険な手法をレポートにしたいなと思ったんです。
>>35 char buff[5] = "aiueo";は
char buff[5] = { 'a', 'i', 'u', 'e', 'o' };と同義
char buff[] = "aiueo";は
char buff[] = { 'a', 'i', 'u', 'e', 'o', '\0' };と同義
typedef struct{
:
:
:
:
}HOGE,*PHOGE;
って
typedef struct{
:
:
:
:
}HOGE;
typedef HOGE * PHOGE;
と同じ意味ですよね?
同じ意味
文字列を返す関数を作ったのですが、リターンで文字列を返した場合
メインの方で、文字列を受け取るにはどうしたらよいのでしょうか?
どなたか、よろしくお願いします。
>>46 return で返せるのは、
・呼び出し元のスコープに所属するchar配列のどこかを指すポインタ
・mallocで確保した領域へのポインタ
・static領域(グローバル変数を含む)に確保されている配列のどこかを指すポインタ
のいずれか。
受け側は単純に char *p = f(); でいい。
文字列を保持したいなら、別途配列やmallocした領域にstrcpyする。
文字列を返すCの戦略について
・呼び出し側確保型
strcpy(), strftime()など。strcpy()は確保された量を呼び出し側で保証する必要がある。
strftime()は確保された量も関数に渡すことで関数側でも制限ができる。
・静的領域型
ctime()など。このタイプは呼び出しごとに内部静的領域が破壊されるため、呼び出し側で
速やかに引き取る必要がある。また、この点からマルチスレッドに向かない。
・動的確保型
strdup()(非標準)など。このタイプは呼び出し側で解放することが必要になる。
しばしばそれは忘れられてメモリリークの原因になる。
構造体の中に char 配列を入れて、それを return で返すという荒技もある。
>>43 てか、C言語の場合は struct を省略出来ないと思ったが、あ、もしやC99で変わった?
俺もそれ思った
52 :
デフォルトの名無しさん:2006/04/25(火) 20:48:27
分単位の時間(min)を読み込み、それを時(h)、分(m)に変換して表示してください。
例:分→時、 分 変換
分?75
1時間15分
この問題のソースをおしえてください。
>>52 ヒント: 60 で割った値と 60 で割った余りの値を使う。
まあ、あとは宿題スレで聞け。
>>50 何の為の typedef かと小一時間・・・
#include <stdio.h>
main()
{
int c,a,b;
printf("文字を入れて下さい");
c=getchar();
}
これを改良して、アルファベットの大文字を入れると小文字に、小文字をいれると大文字に変換するプログラムにしてください!
宿題スレって無くなったのか?
>>55 swich(c){case a:puts('A');
以下zまで
}
>>57 ASCIIコードをなんかかえるみたいなんですが、0x20みたいにです
>>55 if(c=='a'){c='A';}
else if(c=='b'){c='B';}
...
else if(c=='A'){c='a';}
...
else if(c=='Z'){c='z';}
うん、最初は苦労したほうがいいな
宿題スレでききます
バイナリデータをファイルから読み込み、16進で表示させようとします。
1バイトずつ変数に受けて printf しようとする場合、
受ける変数は、char がいいのかな、それとも unsigned charがいいのかな。
それともどちらでもいいのかな。
unsignedじゃないとprintfのとき(キャストしないと)0x80以上だと符号拡張されちゃったような気がする
よくおぼえてないんでためしにやってみれ
うろおぼえなら言わないほうがマシだぞ
67 :
デフォルトの名無しさん:2006/04/25(火) 23:57:27
2重かっことかの計算をプログラミングで書くときかっこで代用できますか?
2重でも3重でも小かっこでいけるが、何故試さない?
>>67 ん? ((1 + a) * 3 + 5) / 2 のようなやつ?
それならいくらでも好きなだけお使いください。
>>63 char で受けて2桁の16進数として出力する場合は & 0xff しないとマイナスの時に
やたら桁の大きな値が出て楽しいことになる。
c ^= !!isalpha(c) << 5;
>>71 unsigned char でキャストすればいいだけだろ。
74 :
デフォルトの名無しさん:2006/04/26(水) 14:22:07
qwせdrftgyふじこlp
while(a) {
while(b) {
continue;
}
}
これだとcontinueではwhile(a)に戻りますが
while(b)に戻す方法はないのでしょうか
それって、while(a)に戻るの?
while(a)に戻らないけど?
78 :
75:2006/04/26(水) 15:07:29
すんません。とんでもない勘違いしてたみたいです
自分のソースではwhile(b)の部分にdoステートメントを使ってたのが勘違いの原因だったみたいです
while(a) {
do {
while(b);
continue;
}
こうか。
80 :
75:2006/04/26(水) 15:13:24
厳密には
while(a) {
do {
continue;
} while(0); //while(b)
}
これでdoに復帰するのだと思い込んでたらしいです
俺馬鹿('∀`)アハハ・・・ハァ
81 :
デフォルトの名無しさん:2006/04/26(水) 15:21:35
>>80 while に飛ぶね。
while(a) {
do {
continue;
break;
} while(1);
}
これならおkだが、
while(a) {
LOOP:
goto LOOP;
}
か
while(a) {
while(foo()) { }
}
int foo() {
return 1;
return 0;
}
の方がすっきりする。
最大値を拾う為の関数ってないですか?
ないから作る。
やっぱりfor文とかでまわして数値を拾うのか・・・
max();とかあればいいのに・・・
maxを使いたいならC++でもやればいい。
今やってる開発言語ANSI Cなのよ・・・
型毎に比較関数が必要になるからね。
C だと qsort みたいなややっこい実装にならざるを得ない。
>>89 とくにない。たまに時間ないとき面倒に思うときがある。そんだけ
車輪の再発明になったらアレだろ?
>>88 そうだ!C にも template を導入してくれればいいんだ!
#define MAX(a, b) ((a) > (b) ? (a) : (b))
これで我慢しろ
ファイル内の文字列を変換するプログラムを作りたいのですが、
どうしたらいいのかわかりません。
わからないことを例にして書きます。
CDをDVD-RAMに変換 ()は文字数です
ABCDEFG\0(8)の⇒ABDVD-RAMEFG\0(13)
この例だと、mallocで8のサイズの領域を作成、しかし変換後は13文字になる。
そしたら領域から文字列から溢れる。
変換後にどれだけの文字数になるか分からないのでめいっぱい領域確保するという手もあるのですが
領域は出来るだけ抑えたいと思っています。
これの解決方法を教えてください。
変換が高々一回なら、元も文字列から5文字増えるだけでは?
変換前文字列も変換文字列も、不定ということです。
それに変換場所が一箇所とは限らない。
例)
AをANSYA変換だとすると
KOUDAGAKUTO⇒KOUDANSYAGANSYAKUTO
同じところはもう一度変換しないとして、
変換する文字列が何回出てくるか数えてからmallocなんですかね?
どっかにC machineをダウンロードできる所ないかな?
100 :
デフォルトの名無しさん:2006/04/26(水) 23:24:08
入力されたいくつかの数字を大きい順に並べるプログラムってどうやって書けばいいですか?
並べる方法が分かりません、ヒントください。
宿題スレで聞くといいよ
qsort
>>100 ifBがAよりLargeならA and Bをchenging汁。
chengingてwwwwwwwwww
system(sort);で全て解決
108 :
デフォルトの名無しさん:2006/04/27(木) 02:12:53
chengingあげ
109 :
デフォルトの名無しさん:2006/04/27(木) 02:14:04
chenging!!
chenging!!
スペルミスはさておき、意味がわからんな
swapしろと言いたかったのかな
get_intに関してなのですが・・・
char *get_int(char *b, int *i)
{
int num = 0;
/* 初期値 */
*i = 0;
/* スペーススキップ */
SKIP(b);
/* 十進数文字である間はエンドレス */
while (isdigit(*b)){
num++;
/* これまでに得た整数の位取りアップ */
*i *= 0;
*i += (*b - '0');
/* 次の文字へ */
b++;
}
/* 十進数字が一つもなければエラーリターン */
if(num == 0) b = NULL;
return b;
}
このようなプログラムを説明するとどういう風になりますか?
位取りとアスキーコードの部分あとb++がどうしても上手く表現できません
暗号解読班、出動だ!
× *i *= 0;
○ *i *= 10;
>>112 *i *= 0; は *i *= 10; の間違いだよな?
SKIP関数がなにするのかよくわからんけど大体あってるんじゃね?
116 :
112:2006/04/27(木) 03:37:52
すいません、*i *= 10;の件は間違いでした。
御指摘ありがとうございます。
このソースをどのような処理をしているかがどうしても説明できなくて困ってます。
仕様書を書かなくてはならなくてそれがどうしても出来ない状態です・・・・
>>117 すませんです。
かなり切羽詰ってて。
とりあえず自分でも調べておきます。
後でまた見ます。それでは
>>116 > このソースをどのような処理をしているかがどうしても説明できなくて困ってます。
> 仕様書を書かなくてはならなくてそれがどうしても出来ない状態です・・・・
中身を理解していないからだ。
そもそも、仕様書はコーディング前に書くものであって、
コーディング後に書くものではない。
>>119 >コーディング後に書くものではない。
…えっ!?
マ板なら納品前にでっち上げるのが常識
ム板ならソースを書く前に完成しているのが常識 > 仕様書
>>98 realloc、足りなくなったら再確保しろ
>>98 ま、事前に数えるのも数行程度のコードで済むだろうから、
数えるコードを書いてもいいかもしれない。
元の文字列がたいしたサイズでなかったら、無条件に三倍程度の
サイズをmalloc()でもいいだろうし。
124 :
デフォルトの名無しさん:2006/04/27(木) 12:00:08
質問なんですが、整数a,b,cを与えたとき、ax^2+bx+c=0の解を求めるプログラム教えてくれないですか?
コンピュータ苦手で
>>124 宿題なら宿題スレへ。
アルゴリズムを知りたいならアルゴリズムスレへ。
そうでないなら初心者向けスレへ。
>>124 > コンピュータ苦手で
じゃあ、使うな
>>112 おそらく、
文字列を十進数字とみなしてその値を引数に返す関数。
129 :
デフォルトの名無しさん:2006/04/27(木) 16:02:29
いきなり書き込みしてすみません!
今、C言語の勉強してるんですけど、テキストファイルとバイナリファイルの差って何ですかね?
ちなみにバイナリファイル以外がテキストファイルです。っていう答えは無しでおねがいします。
データが全部文字コード(ASCIIとかS-JISとかUnicodeとか)
で構成されているファイルがテキストファイル
バイナリファイルの部分集合がテキストファイル
印字可能な文字集合 + 空文字(改行コード/SPC/TAB) のみのバイト列で構成されてる
…で良いのか?
# 文字セットのこと考えると難しいねぇ
嘘を書くな
>>129 ファイルの扱い方の違い。どんなファイルも0と1のデータが並んでるだけ。
バイナリファイルとして扱えば1バイト読み込むとかが出来るし。
テキストファイルとして扱えば1文字読み込むとか1行読み込むとかが出来る。
ただテキストファイルとして扱ったときに文字を表すデータが入ってないと文字化けしたり変な挙動したりする。
134 :
デフォルトの名無しさん:2006/04/27(木) 16:22:54
ありがとうございます!
テキストファイルの事はよくわかりました。
まだ、バイナリファイルが良くわからないのですが?
分かってねーじゃんw
136 :
デフォルトの名無しさん:2006/04/27(木) 16:28:49
すいませんf^^;
133を読む前に書いてしまったので・・・。
137 :
デフォルトの名無しさん:2006/04/27(木) 16:31:34
ということは、バイナリファイルの方が小さい単位で利用できるって事でよろしいのでしょうか?
あと、バイナリファイルで読む込んだものをテキストファイルとして利用できるのですか?
説明しても無駄なようだ。
例えばASCII文字コードでは0から31と127は制御文字として決まっている。
したがって、おそらくテキスト文書は、この制御文字の中で、
改行を表す\r\n(CRLF:キャリッジリターン(行先頭復帰)+ラインフィード(1行送り))を表す
0D(\r)とA(\n)しか使えない。
なぜなら、例えばテキストにff(DEL操作)の文字なんか入れられない(文字削除になる)。
バイナリエディタがあったら、適当にテキストに文字を打って、それをエディタで開いてみればいい、
ENTERしたところは、\r\n(0D0A)があって、最終行を改行しなければ\r(0D)になる。
バイナリファイルというのは、CPUが実行できるマシン語だから、当然0〜31、127は含まれている。
当然、.txtを.binに変換してもマシン語で使っている1〜32と127が使えなければ実行できない(使ってないマシン語がなければ別だけどw)
ちなみに、改行は\n(一行送り)だけでいいではないかと思うけれど、
タイプライタが、改行は、一度、行の頭に戻ってから、一行送るという、名残。
Cではprintf("ほにゃらら\n");
と\nだけで通用する。
officeアプリは\r\nじゃないとだめだったと思う、他にも・・・あったかな、忘れた。
そんな環境依存の話されても・・・
>139訂正
>0から31
0から32
>1〜32
0から32
要は使えないのは0〜32(ヘキサで00〜20)と127(同じくff)
(あ、\rと\nは省いて)
>>138 「説明できないのは分かっていない証拠」
と教えてもらったことがある
>>141 わかってないなら説明しなきゃいいのに。
>バイナリファイルというのは、CPUが実行できるマシン語だから、
いつからバイナリファイル=マシン語になったんだ?
>>141 >「説明できないのは分かっていない証拠」
まあ、
>>139 みたいに説明されると
「ああ、こいつまるで解ってねーや」ってのが判断できるわけだしね。
>>137 はっきりした定義があるわけじゃない。
とりあえずメモ帳で開いて、半角中黒が使われてなければテキストファイルだと思っとけ。
このスレ的には、「一部の環境 (OS、コンパイラ) では、ファイルオープン時にテキストだと明示
すると、改行コードや文字コードの変換をしてくれる “かもしれない”」としか。
>あと、バイナリファイルで読む込んだものをテキストファイルとして利用できるのですか?
例えば、メモ帳だと、認識できないコードは■になる。(要は、エディタやエンコードによる)
それで利用できるなら使える。
>143
まあ、確かに。
バイナリと一言にいっても広いし。
例えば、圧縮解凍ソフト作って、圧縮ファイルの拡張子を.binにしたっていいわけだし。
メモ帳だとUnixのテキストファイルが1行になってしまう訳だが...
テキストもバイナリファイルの1種に過ぎないし
全てのファイルはバイナリだ。
プログラムの側はそれをテキストとして扱うかどうかを決められるに過ぎない。
テキストとして書いたファイルは同じシステムや互換性のあるシステムでテキスト
として読むことが可能ということ。互換性のないシステムではそのままでは
テキストとしては扱えないかも知れない。扱えない場合はバイナリとして開いて
自分で変換しながら読むとか、あるいは予め変換してから読むことになる。
パイプもコンソールもプリンタもファイルの1種だが、バイナリなのか?
MSがテキストだのバイナリだのくだらん事を広めたのが悪い
>>150 内容はバイナリだよ。
扱い方がテキストだったり画像だったりするだけ。
>>129 エディタで開いてみて、文字っぽかったらテキストファイル。
>>129 こんなんどう?
1.コンピュータは今のところ、電圧が低い・高いの2つしか判断ができなくて、それぞれを0と1とする。
2.0と1だけで表した数字を2進法といい、例えば、1+1=10、10+1=11 となる。
3.コンピュータ(内部)は基本的にこの2進法で計算(処理)することになる。
4.我々が普段使っているのは10進法であるが、2進法と10進法は相互に変換可能である。例:11(2進法)=3(10進法)
5.ファイルというのは通常HDDに保存されているが、2進法で保存されており、磁気(S極、N極)を0と1としている。
6.実は2つ(0と1)を表せるものならなんでもよく、例えばCDならば穴が開いている、開いていないという方法で保存されている。
7.各文字には数字が割り当ててあり、例えばアルファベットのA=65といった感じである。
8.どの文字にどの数字を割り当てるかには色々な規格があり、規格によって割り当て方が異なる。(規格例:SJIS、EUC)
9.この規格にそって保存されたファイルを通常、テキストファイルと称されている。それ以外をバイナリーファイルと言う。
10.ソフト(エディタ等)はファイルを読み込むと、ファイルに書かれてある数字を文字に変換し画面に出力する。
11.先述したようにこの文字⇔数字変換の規格は多種あり、規格通りの変換が行われないと、文字化けといった現象が起こる。
12.バイナリエディタとはこの文字⇔数字変換を行わずに、数字をそのまま画面に出力するエディタである。
13.2進法で数字を画面出力すると、011101101001010 といった感じになり人間には非常にわかりずらい。
14.そこで、2進法との相互変換が容易な16進法がコンピュータ世界ではよく使われている。
15.バイナリエディターでは通常、人間が見やすいこの16進法で画面出力される。
テキスト形式ファイル
形式にすぎない
おわり
で、
制御コードはファイル内だけにとどまらず、
オブジェクト間、ファイル間、プロトコルにもあるわけだけど、
BASE64に話が続くかと思いきや、やっぱりでないか。
前者2つは思いっきり環境依存だからしようがないと言えば、しようがない
>>154は
自分の知っている、うんちくを語りたかっただけです
( ´,_ゝ`)プッ
>>151 確かにlinuxの場合もファイル操作する場合拡張子なんて意識しなかった
希ガス
>>161 ハァ?拡張子??なんでそんなもんがでてくるんだ?
コンパイラについて教えてください。
下のようにしたらVC++とgcc用に大文字小文字を区別しない比較が出来ると聞きました。
VC++は_WIN32がデフォルト定義されているというので分かるのですが
elseならgccと判定してしまうのはどうなのかと思うのです。
もし他のコンパイラ(私は何があるか詳しくない)だった場合のために
#ifdefで判定できないでしょうか?
#ifdef _WIN32
#include <string.h>
#define STRCMP(s1,s2) stricmp(s1,s2)
#else
#include <strings.h>
#define STRCMP(s1,s2) strcasecmp(s1,s2)
#endif
さっそくありがとうございます
__GNUC__は、gccですよね?
それとこういうことが詳しく載ってるサイトは知らないでしょうか?
自分用にライブラリ付くリョウと思っています。
>>163 #elif defined(__GNUC__)
結構多いですね。。。
このなかでよく使われているコンパイラってどんだけあるの?
ここを見た限り、VC++は_WIN32より_MSC_VERで判定したほうがいいの?
ちなみに私は英語苦手なのでまだ軽くしか見ていません。
間違ってても気にしないで!
170 :
168:2006/04/27(木) 22:55:52
>>169 たった今確認しました。(翻訳サイトで)
うん、やっぱりそれっぽいこと書いてる!!
171 :
デフォルトの名無しさん:2006/04/27(木) 23:18:30
int i[3]; って宣言して
i[5] = 10; と入れてもエラーにならないのはなぜですか?
エラーじゃないから。
173 :
171:2006/04/27(木) 23:20:46
動的に配列の範囲チェックを行ってエラーを出すような機構がないから。
175 :
171:2006/04/27(木) 23:25:57
>>174 どうもありがとうございます。なんとなく理解できました。
別な所でエラーが出るかもしれないがなー。
たとえば?
C言語の配列というのは単に配列の宣言時に指定した長さ分の連続したメモリ領域で、
配列の変数が表しているのは配列の先頭要素へのポインタに過ぎない。
そのポインタをインデックスで指定された分だけオフセットして各要素にアクセスしている。
したがって、配列の長さを超えるようなインデックスを指定しても、
その参照先のアドレスが予めプログラムが確保しているメモリ領域に収まっていれば、
必ずしもエラーにはならない。
ただし、その参照先のアドレスは、他の変数などに割り当てられている可能性があり、
その内容を書き換えれば意図しない動作をもたらすことがある。
コンパイラがたまたまiの近くに配置した領域を上書きするとか
つうか聞いてばかりじゃなくてやってみれ
どうやればエラーでるの?
エラーすら出ない環境もあるが、
例えば、アクセスを試みて、アクセスできなかった時などがある。
#include <stdio.h>
#include <windows.h>
typedef struct {
int i[1];
void (*func)(void);
} hoge;
void hello() { printf("Hello, World!\n"); }
int main() {
hoge fuga;
ZeroMemory(&fuga, sizeof(hoge));
fuga.func = hello;
fuga.i[1] = NULL;
fuga.func();
return 0;
}
エラーでコンパイルができません。
うそーん。全角スペースを半角に直した?
windows.hなんてありません
ふざけないでください
環境はVisualCでは否なのか
ならwindows.hはない
あと仮にVC環境ならスペースは受け付けない、すべてTABにしな
189 :
デフォルトの名無しさん:2006/04/28(金) 01:16:00
配列の質問です。
配列を宣言したときにメモリが確保されると思うのですが、
そのとき確保されるメモリアドレスは連続したものなのでしょうか
具体的にいうと
char gefo[100];
と定義して
&gefo ++;
を400回繰り返した場合、最後にはgefo[100]用のメモリの
一番後ろのバイトに到達していると考えていいものでしょうか?
191 :
デフォルトの名無しさん:2006/04/28(金) 01:22:11
返信ありがとうございます。
そうなんですか・・・・
char型は4バイトだからポインタ演算?するときは
配列100個だったら、400回たすのかなーと考えてたんですが;
>189
違う、連続していない
だから、逆に配列はアセンブラじゃなくCで書いたほうが効率がよいのができたりする。
違う型を含む構造体ももちろんそう。
どう飛ぶかはCPUの命令セットのアドレッシングの方式による
冗談にしては面白みが無いね。
&gefo++
って、
&(gefo++) (&gefo)++
のどっちになるんだっけ?
195 :
189:2006/04/28(金) 01:30:59
>>192 >どう飛ぶかはCPUの命令セットのアドレッシングの方式による
うーむなるほど・・・
どうもまだまだ勉強が足りないみたいです。
K&Rを再読してきまつ
ありがとうございました。
196 :
デフォルトの名無しさん:2006/04/28(金) 01:39:41
Cのcgiのプログラムなんですが、コンパイルしてコマンドラインから実行すると動くんですが、
ブラウザ経由で実行すると、共有ライブラリが無いよ、のエラーになります。
LD_LIBLARY_PATHとか、httpd.confのSetEnvとか、ldconfigとか試しましたが、
現象変わらずです。
ldd というコマンドが有るとわかったので、コンパイルした実行形式をlddしてみると、
問題ないのですが、cgi-binにコピーしてlddすると、無いよと言われる共有ファイルが、not found
になります。
これ、ナニが問題なのでしょうか?
本読む前に、手を動かして書いてみろよ
198 :
170:2006/04/28(金) 01:49:58
自作ヘッダーファイルの続きですが、
入れておいたほう便利なものってあります?
無い
余計なものは入れるな必要最低限だけ入れろ欲張るな
前を見ろ堅実になれ、もっと考えろ想像しろ
以上
>>192 char の場合に限定すれば連続してるんじゃまいか
202 :
デフォルトの名無しさん:2006/04/28(金) 02:23:07
c言語でシリアルポートを開きたいんですけど、
int WINAPI WinMain(
HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{}
と
int main(int argc, char* argv[]){}
をどっち使ったほうがいいんですか?
204 :
デフォルトの名無しさん:2006/04/28(金) 04:44:58
MINIXのソースコードの中からなんですが,
00045/* Throw away the parameters for K&R prototypes. */
00046#define _PROTOTYPE(function, params) function()
このプロトタイプ宣言の意味がいまいち分からないのですが。
00483_PROTOTYPE( void _exit, (int _status) );
00484_PROTOTYPE( int access, (const char *_path, int _amode) );
こんな感じで使ってるんですけど,パラメータ捨てちゃって何か意味があるんでしょうか。
あとプロトタイプ宣言ってそもそも戻り値が必要ではなかったでしたっけ。
http://www.minix3.org/doc/AppendixB.txt
>>204 これ、なんて書いてあるか分かる?
↓
Throw away the parameters for K&R prototypes.
>>191 > char型は4バイトだから
char型は1バイトだ。
# ビット数は環境依存
ついでに、配列型に対して「++」や「--」は出来ない。
>>192 > 違う、連続していない
連続しているから「配列」な訳だが。
>>201 char以外でも配列は連続した領域が割り当てられる
物理的にメモリに連続して割り当ててなければいけないとするなら
仮想メモリなんて崩壊してしまう
C言語で「メモリアドレス」と書かれているのを読んで「物理的」とか思う頭は
なくていいよ?
どっかいけ。
じゃあ連続とはどんな意味で言ってたの?
C言語から見て連続だろう。
>>189が発端?
>>189はメモリアドレスと言っているけど、それが物理アドレスを指しているのか仮想アドレス
を指しているのかは分からないよね。
質問の内容からすると仮想アドレスと取っていいと思うけど。
個人的には、
>>192の意見をもうちょっと詳しく説明して欲しい。
アライメントの話じゃねえの?
char配列を4バイトなり8バイトにアライメントするような処理系があるかどうかは知らんが。
配列はパディングを入れないようになってるはずだが。
そもそもポインタがアドレスと等しいとは限らないわけだが。
(そんな実装、今時あるかどうかは知らない)
パディングだのアライメントだのしらないが、必ず+1で一つずれるのでは
>>192はかなりあっちの方にすっ飛んでいって帰って来ない人の意見だろう
>>216 ポインタ=アドレス+型 じゃないの?
まあ、この「アドレス」がCPUレベルでの
「アドレス」と等しい必要は無いが。
221 :
192:2006/04/28(金) 21:31:52
>>201 >char の場合に限定すれば連続してるんじゃまいか
確かに。
基本的にchar型は1byteだけど、コンパイラにより可変長になりうるから
・例えば、char fuga="abc";として、a[0]で'a'を取り出せる。
・逆にfuga[0]='a',fuga[1]='b'でfugaは配列の先頭を表す('a')
連続している。
ただ、これはCの仕様というか使いやすくするための特別な仕様であって、配列の基本はこうじゃない。
基本的な配列は連続したアドレスではない(論理アドレスだろうと、実アドレス変換した物理アドレスだろうとスタックは連続した領域採るでしょう)。
まあ、ものは試しで、以下のをデバッグ掛けてメモリ見てみてよ、皆さん方。
上は、連続したアドレスを採る。下はアドレスが飛び飛びになる。
配列としては下がメインタイプ。ちなみに自環境はVC。
例1)
#include<stdio.h>
void main(void){
char a[6]={'a','b','c','d','e'};
printf("%s",a);
}
例2)
#include<stdio.h>
void main(void){
char* name[3];
name[0]="あいうえお";
name[1]="かきくけこ";
name[2]="さしすせそ";
printf("%s",*name);
}
あと、仮想メモリというのは、ハードディスクに一時領域採る事じゃないかな。
下のコードのどこを指して、連続してないって言ってるのか。
「あ」から「そ」まで連続してないって言いたいんじゃね?
>>222-223 実際メモリ見て言ってる?
まさか[]内の数値見て言ってわけじゃ・・
机上の空論言っても堂々巡りだと思うけど
たったこれっぽっちのソース出せば明らかになるじゃん
>>224 あー、そういうことか。
喰い違いがあったか。
言ってるとおり、あーお、かーこ、さーそ、の3つは連続していない。
>>226 じゃ、具体的にどこが連続してないって言ってるの?
> char* name[3];
フツーに連続してる。
>>227 確かにデバッグできるコンパイラ持ってない人も居るわけだな。
「お」と「か」、「こ」と「さ」の間はいくつかの00で埋められている。
だからこそ、下の実行結果は
あーそ
で出ずに
あーおで終わる
コード00は「何もしない」を表す。
>>225 念のためにVCで実行してみたけど、並んでるようにしか見えない。
main()
{
char *name[3];
printf("%p %p %p\n", &name[0],&name[1],&name[2]);
}
--
結果
0012FF74 0012FF78 0012FF7C
>>230 それ、何も値が入ってないけど、判別できんのかいな。
連続してない言ってるやつは
ポインタの配列の意味分かってるんだろうか
デバッガの出力より先に理解する事があるだろ
>>229 お前あほだろ。
元の質問は、配列が並んでるかどうかの話だろ。
ソース上に現れる文字列リテラルが連続してるなんて、そんな勘違いするやつどこにいる。
>>221 こんだけしったかぶって、配列の要素のアドレスと、中に入ってる値の
区別がついてないやつ。
これどう解釈をすればいいの?
char*だから、一つ要素に対しての4バイトのメモリ領域を取っている?
配列要素が3つだから全部で12バイト?
>>235 「どう解釈」って、まさか
>>230のソースのことか?
とりあえず、GW中は入門書でも読んどけ。
>232
確かに。例が悪かった。
ただ、確認してみたけど、&name[1],&name[2],&name[3]は連続していずにはるか彼方にある。
通常の**とは違っている。
ポインタ理解できない奴はC♯でもやってろよカス
>>236 あっ、ごめん。
>>221のソースです。
>>230のように解釈するのが普通と思っていたから。
なんで連続でないって言っているかが不思議に思って。
で、
>>230を見ると、4バイトずつ増えているからやっぱり連続だね。
>>237 こいつまだ言ってる。
なんか適当に難しそうなこといって、周囲をけむにまくのが習性になってるんだろうな。
なるほど
ポインタ死ね
なんていうスレも立つわけだ
> 237 名前:デフォルトの名無しさん [sage] 投稿日:2006/04/28(金) 22:12:06
> >232
> 確かに。例が悪かった。
頭が
(事実歪曲)
> ただ、確認してみたけど、&name[1],&name[2],&name[3]は連続していずにはるか彼方にある。
おらず
(日本語の間違い)
> 通常の**とは違っている。
脳内の
(病院池)
プログラミングの勉強ばっかりするのもいいけど
たまにはコンピュータの動作原理とかプログラムの動作原理とか勉強するのも無駄にはならないぜ。
コンパイラとアドレス方式とアドレス指定方式
なんだようやく判ったよ。
>>192は釣りだったって…orz
パタヘネぐらい読んどけよ
> コード00は「何もしない」を表す。
そうなのか?
まあ、釣りなようで釣りでないようで、アドレスバス幅は決まってる。
けど、釣りな結果は運がよかっただけだな。
色々試すとそのうち・・・
>247
NULL
>248訂正
アドレスバス幅>データバス幅
「コード00は『何もしない』を表す」もNULLもちょっと違う気がする。
>>250 だいぶ違うな。
それ使い分けできてないと、本当に素人くさいよな。
つかいわけつーか「コード00は『何もしない』を表す」にいたってはイミ不明だけど。
>コード00は『何もしない』を表す
そういや 8080/Z80のNOPは00hだったな。
関係ないけど。
惜しむらくは、釣ろうとした張本人の実力が今一歩及ばなかったことか…
落ち着いたところで。
惜しまれるから、運が悪かった場合も張っておこう。
#include<stdio.h>
voidmain(void){
char*name[3];
name[0]="abcde";
name[1]="あいうえお";
printf("%s",*name);
name[2]="fghij";
}
今でもNOPは00hだし、オペコードが00なら何もしないな。
ブルーバックも出ずにそのまま固まる。
オペコードなら0引く0でZフラグが立つ。
C言ガーにとっては\0と言った方がよかったかw
オペランドなら0引く0でZフラグが立つ。
x86のNOPは90hだよ。
喪前ら低脳晒し大会はいい加減に汁。
だってぇ〜、他のお客さんが寄りつかなくて暇なんだも〜ん
初心者を惑わすのはかわいそうだからやめてやれ。
はじめまして
プログラミング初心者です。
c言語をテキストを買って始めたのですが
C:\work>bcc32 hello.cと入力すると
コンフィグレーションファイル中の オプション間違い:-|"c:\Borland\Bcc55\include"
というエラーが出てしまいます
cfgは こんな感じなんですが
bcc32.cfg
-|"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
どこが間違っているのでしょうかしょうか?
教えてください。
くだらないネタはやめてくれ。
>>261 プロバブリー ミス オブ カレントディレクトリ バイ ワークホーム オ〜イエ
ソウ ファーストタイム コマンドクリック bcc32 バイ コマンドプロンプト。
イフ(エラーなら) エンバイアロメンタルバル を アナライズ。 レッツユーゴーイング
>>261 >-|"c:\Borland\Bcc55\include"
-I"c:\Borland\Bcc55\include"
ですね
さすが黄金週間だなw
266 :
デフォルトの名無しさん:2006/04/29(土) 13:22:17
267 :
デフォルトの名無しさん:2006/04/29(土) 13:26:47
hoge( int iCnt, AAA_STR *pAAA );
hoge()関数に、structの配列intのカウンタを渡して、hoge内でカウンタまでstructのポインタを進めて、
構造体の中のデータを加工したりしようとしています。
そこで質問です。
hoge()に渡すカウンタの数値が間違っていて、実際の構造体の配列数より大きい値を渡してしまった場合、
hoge()内で構造体の配列以上の領域を参照・書込みしようとして、プログラムが落ちてしまうことがあります。
このとき、hoge()内で、操作しようとしている構造体の領域が、参照・書込みなどが可能な領域かを
判断する方法はあるのでしょうか?
>>267 書き込んで落ちれば書けないと判断できる
間違えなきゃいいじゃんか。
どうしてもというならpAAAの最後にはっきりと無効だとわかるデータを用意して
ループ回すたびにチェックしろ。
関数内で(配列要素MAX > iCnt)なら実行すれば全て解決
配列要素サイズも渡すよろし
272 :
267:2006/04/29(土) 13:46:04
どうもありがとう。
俺も間違えるほうが悪いと思ってたんですが、hogeはdllだかスタティックリンクライブラリだかにすることになってて、
hoge呼び出し側がどんな値渡してもhoge側で異常を関知して、落ちずに異常を返却しろ、といわれて
質問しました。
チェックしてからDLLに渡せばいいだろ
チェックする関数を提供汁。
gcc で -lm っていうオプションがあるのですがこれはどういう意味ですか?
調べても分かりませんですた。
277 :
275:2006/04/29(土) 17:46:15
>>276 調べたら、-l(library)で -lmはmから始まるlibraryをincludeするってことであってまつか?
>>267 struct MANAGER_STR{
int counter_aaa;
struct AAA_STR *pAAA;
};
で管理すればええ。
>>277 includeじゃなくてリンクな。
この場合、リンカがlibmを探してプログラム中で使われているライブラリ関数をリンクする。
280 :
275:2006/04/29(土) 18:29:39
スレ違いの質問に答えるなよ
282 :
デフォルトの名無しさん:2006/04/30(日) 00:05:43
答えらんねー奴は黙ってろ
>>272 C++使ってtry...catchで処理しろ、って事ジャマイカ?
284 :
デフォルトの名無しさん:2006/04/30(日) 14:48:36
conio.hにあるgetche()関数を使いたいのですが
gccにありませんでした。同等の機能の関数てないですよね?
その質問はスレ違いです
C言語の関数で文字列を返す事ってできないですよね、
そこで、漏れてきに考えたのだが、
返したい文字列を別の配列として宣言しておいて、
関数でその文字列のポインターを返せるようにしておけば
漏れの脳内ではできそうなのですが、百戦錬磨の諸兄どもは
文字列を返したい場合どうしてマツカ?
オルテガさんは華奢な男性かと思ったら、ガチムチ系の兄貴でびっくりしました。
ガチムチオルテガさんは流れるプールの横で懸命にマラをしごいていた。
越中六尺から飛び出している凶器は悪魔そのものですごかった!唖然として
僕が兄貴を眺めてると、兄貴が突然振り向いて眼があってしまい、
そのままオッス!オッス!と連呼して僕に近づいてきた。あとはもうオルテガ
さんの坊主頭が僕の背中を攻め、菊の花をていねいになめまわしまくり、
生物兵器が僕の菊爆弾を何度も何度もオッス!オッス!と鼓動させるのを覚えてるだけです。
ガチムチオルテガさんはすっげー男らしくてなんどもイキまくりました
関数を使う前にバッファを用意してそれを関数の引数に与える
関数内でバッファに文字列を書き込む
Cの標準関数でもこうなってる
ォオー!!(゚д゚屮)屮
>>46で既出してますたスマソ
しかし
>>290氏のアイデアは、Cの標準関数でもこうなってる
と書いてあるものの、斬新な感じがする、漏れも脳内で掘下げて
考えてみます、とこでスレ違いですがついでに知っていたら教えてください
ご存知なければスルーで結構です
NET系の関数も(VS2005のVC8とか)文字列の返せる関数はないですよね?
.NETなら文字列クラスを返す関数はたくさんあるんじゃないか
>>293 斬新か・・・?
標準関数で例えばsprintfだと
main(){
char buffer[80];
int x = 50;
sprintf(buffer, "x = %d", x);
puts(buffer);
}
こんな感じに使うと思うが、ほんとに斬新だと思う?
ちなみにC++とかなら、string型の変数を返すだけですむのでこんなことしない
↑ちなみにそれバッファを0クリアしてないといけなくね?
>>296 sprintfはちゃんと末尾にヌル文字入れてくれなかったっけ?
>>294 そうですか調べて見ます
>>295 関数といえば、直接返すことしか考えられない愚民にとっては十分斬新でした
そして頑ななまでにスルーされる>48(=288=298か?)であった。
だって48読んでも意味わかんないし
ん?ありがと・・
名前付けの問題です。
class Hoge {
public:
int getX();
void setX(int i_x);
getX(int& i_x);
private:
int x;
};
int Hoge::getX() { return x; }
void Hoge::setX(int i_x) { x = i_x; }
int Hoge::getX(int& i_x) {i_x = x;}
ここで最後のgetXですが、なんとなくgetという名前を与えるのは、
ちょっと違和感があります。一般的にこういった関数にはどういった名前付けをするのでしょうか?
>>304 最後のgetXにreturnがない訳だが...
それ以前に、Cにクラスはない訳だが...
>>307 1番目はミスでした。
2番目はよさそうなスレがなかったからです。失礼しました。
>>287 関数の参照使っても返せるけど、
strcpy,sprintfがフローチャート的にいけるからスマートだと思う。
ただし、宣言やmemset等で確保した受ける側の領域超えると、スタックオーバーフローになるから気をつけないと(strlenなんかでチェックかけないと)。
>フローチャート的にいけるから
関数の参照のように可逆じゃなく不可逆
312 :
デフォルトの名無しさん:2006/04/30(日) 19:52:32
>>309 まれに見るほどの突っ込みどころ満載のレスだな ・・・わざとらしいんだよ釣り野郎
314 :
デフォルトの名無しさん:2006/04/30(日) 20:00:26
struct a {
int i;
};
struct b {
struct a x;
int j;
}
b xxx;
a *yyy = (struct a*)&xxx;
って書き方あり?
宣言の仕方を勉強してください
316 :
デフォルトの名無しさん:2006/04/30(日) 20:16:56
>>315 具体的に何が悪いの?
structのつけ忘れとか、;の付け忘れとかでとりあえず文句言ってるの?
>>314 まあ、色々ミスに目をつぶれば、可能だが、
キャストするよりは、&xxx.x を入れた方がいい。
Cでオブジェクト指向をやる方法みたいなウンコテクニックを書いてるサイトで、
>>314みたいな書き方をしてたような。
>>314 これなら許す。
a *yyy = (struct a *)((char *)&xxx + offsetof(struct b, x));
そんな糞コード、後にメンテ依頼される人の身になったら書いちゃ駄目でちゅよ
>>320 俺は今まで offsetof を使っているコードで
ロクな目にあったことが無いのだが?
322 :
デフォルトの名無しさん:2006/04/30(日) 21:08:21
>>319 そう書かないと問題が起こるからなの?
でもどういう問題が起こるかちょっと思いつかないんだけど。
まぁ直接触らせずにマクロ用意することのほうが多いよな。
326 :
デフォルトの名無しさん:2006/04/30(日) 21:23:58
>>321 C++ ならメンバポインタがあるけどな
あれの代わりを自前でやろうとすると無意味にきつい
typedef struct Figure {
int no;
char name[10];
}
Figure figure = (figure*)alloc(sizeof(figure)*5);
これはどういう意味ですかね?
検索して出てきたプログラムなのですが全くわかりません
328 :
デフォルトの名無しさん:2006/04/30(日) 21:43:40
>>327 $ gcc 327.c
327.c:5: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'figure'
若干端折ってないか?
330 :
デフォルトの名無しさん:2006/04/30(日) 21:47:13
そういう問題じゃねえだろ ぼけ
>>327 マジレスすると、
int no;とchar name[10];をメンバに持つ構造体5個分の領域を動的確保して、
そのポインタを格納しようとしているのかな。間違ってるけど。
332 :
デフォルトの名無しさん:2006/04/30(日) 21:54:05
うん、間違ってる
エラーのあるコード=つまりゴミを拾っただけ
そこのサイト主がなぜそんなコードを出しているのかをよく読むことがまず必要
typedefした意味が分からない
>>333 typedefの閉じカッコの後にセミコロンがないから、
struct FigureをFigureでtypedefしつつ、figure変数を用意してるんじゃね
同名typedefは推奨できないし、後々Figureを使うことがないなら無意味なコードだな
figure に figure * 型を代入しようとしているのが間違ってる。
figure自体が型じゃないから二重に間違ってる。
336 :
327:2006/04/30(日) 22:43:42
どこを直せば動くようになりますかね?
>>336 全く自分で考えられないならプログラミングなんて止めたら?
>>336 typedef struct _Figure {
int no;
char name[10];
} Figure;
Figure *figure = (Figure*)malloc(sizeof(Figure)*5);
339 :
デフォルトの名無しさん:2006/04/30(日) 22:56:58
>>337 生まれてくるときに生まれてくることを自分で考えられた?
考えられないなら生まれてくるの止めるべきだったね。
遅くないから自殺したら?
詭弁
まあ今後プログラミングをやっていく上で必要なのは
自分で問題を解決する能力、しようとする意欲だからな。
それがないなら止めた方が身のためだろう。
>>339 はっはっは逆切れしてんじゃないよw
そのまま困ってろw
最近の子はすぐキレますね
流石、黄金週間だな
345 :
デフォルトの名無しさん:2006/05/01(月) 19:38:46
スレ違いかもしれませんが、gccで数値計算をさせてるんですが
CPUを100%活用して計算させる事って可能でしょうか?
「CPUを100%活用する」の定義を書け
また随分と抽象的な質問だなぁ。
「CPUを100%活用する」するとはどういう概念のつもりなのかね。
いずれにしても、スレ違いなのでCPUスレなり環境依存スレなり探してネット。
質問します。
私は、セレロンを使用してますが、一時的に割り込み禁止にして
かつCPUの周波数を低くして処理を実施することは可能ですか?
そのようにしたい理由は、ある処理をする際に時間計測したいのですが
やるたびに時間が変わってしまうのです。
あと、マイクロ秒単位の計測ってできますか?
できないようなら、周波数を低くして全体的に処理時間を遅くすることで
どの処理が早いか計測しようと思ってます。
使用するコンパイラBCC5.5、CPUはセレロン600MHzです。
349 :
デフォルトの名無しさん:2006/05/01(月) 19:58:04
fscanfでファイルの中身を読み込みたいのですが。
ファイルの内容は以下のような感じです。
12.5
23.7
3.8
111.5
試しに1行だけ読み込むのを作ろうと、
double naiyou;
FILE *fp;
fp=fopen("xxx.xxx","r");
fscanf(fp, "%f", &naiyou);
fclose(fp);
というようにやっても入ってくれません。
同じことを下のように整数型でやると、問題ないんですが。
int naiyou1, naiyou2;
FILE *fp;
fp=fopen("xxx","r");
fscanf(fp, "%d.%d", &naiyou, &naiyou2);
fclose(fp);
(naiyou1=12 naiyou2 =5と入る)
この場合、どうして実数型だと入らないのでしょうか。
>>350 入力は%lfじゃないと駄目なんですか。ありがとうございました。
352 :
デフォルトの名無しさん:2006/05/01(月) 20:10:10
>>350 書式指定と変数の型が違う時ってどうなったんだっけ?
353 :
352:2006/05/01(月) 20:22:17
ああ、そうか。
読み取った数値を float だと思って(大抵 16bit) double の領域(大抵 32bit)に書き込むから、読み出した時におかしくなるんだな。
推奨されるソースの記述方が詳しく載ってるサイトってないですか?
大文字や _ などの使いどころがいまいちわからないもので・・・
>>355 コーディングスタイルで検索したらいろいろ出てこない?
>>355 主観的なものなんだから、推奨もクソもないだろ。
そもそも、誰が推奨するのかと(ry
358 :
デフォルトの名無しさん:2006/05/01(月) 23:08:52
>>355 それは自分の周りの人との協定であって
どこぞのサイトだの誰それが言ってるから正しいんだぁぁぁぁ〜みたいな、
だだをこねるオナニー小僧が全てを超越して最も迷惑
仕事は中身で勝負するのが本質であって
コーディング基準を破って得意がることには誰も金を払う価値を感じない
協調性の低い人は組織には向かないんで
一人で完結できる仕事をしたほうが自分と世のため
ただ_で始まる識別子はマズー
__hoge
とふたつ付ければいいじゃんと言われてめまいを起こした記憶が
>>356 参考になりました。ありがとうございます
>>357-358 確かに他人の主観は自分に置かれてる環境と=で結びつかないですね
あくまで参考にするまでに留めておきます
>>359 恥をしのんで訊くけど、_で始まる識別氏ってどういうところが拙いの?
>>361 処理系用に予約されている。
細かい話をすると _ で始まるもの全部ってわけじゃないが、
混乱を招くので _ で始めない方がいい。
MSDNみてみろ!_で始まる関数いいいっぱいあるぞ!!!
364 :
デフォルトの名無しさん:2006/05/01(月) 23:29:17
名前管理としては極めて稚拙
コンパイラの提供者だけを特別視しサードパーティを無視しており
先人の業績の上に築けという思想と真っ向から対立している
365 :
デフォルトの名無しさん:2006/05/01(月) 23:30:24
>>362 > 処理系用に予約されている
そんなことはないだろ
366 :
デフォルトの名無しさん:2006/05/01(月) 23:30:55
だぬ。
367 :
デフォルトの名無しさん:2006/05/01(月) 23:33:16
たぬき
コンパイルエラー(リンクエラーかな?)で `hoge.dll@_hoge が見つかりません' とか
言われるけどそのときの _ と同じ?
昔、職場で、_一文字の変数を使ってる人をみて、ショックを受けたことがある。
>>365 そういうセリフは規格見て確認してからにしてはどうか?
ひたすら高速無限ループする処理があります。グローバル変数を直接も参照するよりも、
関数内にグローバル変数のポインタを作って、よりループに近い位置(?)のポインタを
参照させた方がコストは低くなると考えて良いでしょうか?
int global = 1;
void func(void) {
int *p = global;
for(;;) {
if(*p == 1) hoge;
}
}
372 :
デフォルトの名無しさん:2006/05/01(月) 23:54:08
>>371 実用上、書くことがあるが
それを C で書いてる時点でガイキチ確定
373 :
デフォルトの名無しさん:2006/05/01(月) 23:55:23
>>370 それを言うなら、_が予約されている処理系の具体名を挙げてもらいたいな
俺は、_で始まる名前が好きだから、HPUXでもSolarisでもgccでもWindowsでも使っている
コンパイラにおこられたことはないよ
>>371 そういう、どういう書き方が速いかって問題は、実際に
計測してみないとわからんよね。
>>363 それはVisual C++という処理系が自分独自の関数・変数などに使っており、きわめて正しい使い方だ。
>>365 つ規格書。jiscでX3010。
>>368 違う。
377 :
デフォルトの名無しさん:2006/05/02(火) 00:00:39
>>373 予約と言っても大抵の処理系では特に弾くことも無いので、
実際に名前の重複が起こってエラーにならなければ、我々が使ってもコンパイルできてしまう。
言わば紳士協定のようなもの。
>>371 そういう「ポインタは速い」って言う思い込みによる、
「エセ高速化」ほど迷惑極まりないものはない。
高速化したいなら、プロファイラなどで処理時間を計測し、
ボトルネックを探す事から始めろ。
つまり、>373は無頼の輩と言うことだな。
381 :
デフォルトの名無しさん:2006/05/02(火) 00:10:02
>>379 どう書けば速そうかの見当のつけ方は必要だろ
ボトルネックに関してはそのとおりだが
>>381 それじゃ、プロファイリングもせず実測もせずアセンブルリストを眺めることもしないで流言卑語に惑わされるようなことでは高速化なんて夢のまた夢だな。
>>381 式「globe」:変数の参照のみ
式「*p」:変数の参照+*演算子による演算
>>371の例なら、ポインタの方が遅くなりそうに感じないかね?
実測もせずに↑の様な事を言い出しても、説得力ないだろ?
どう書けば速くなるか?は、実測した後で十分。
そこがボトルネックじゃなければ、考えるだけ無駄。
今までプロファイラというものは聞いたことがあっても
使ったことはありませんでした。
今日使ってみて自作のメモリクリア関数とmemsetを競わしたら
自作とmemsetでは300サイクルもの違いがありました。
クリアバッファは1024byteです。
やはりmemsetを超えることはできないのか・・・・?
>>383 ポインタ変数がレジスタに割り当てられて、グローバル変数のアドレスが即値で扱われるとか
そういう感じだったらアーキテクチャによっては、ポインタのほうが速くなるね。
最適化によって、グローバル変数には毎回見にいかないかもしれないし。
とにかく実際にみてみないとわからんよ。
386 :
デフォルトの名無しさん:2006/05/02(火) 00:32:16
387 :
371:2006/05/02(火) 00:34:29
ありがとうございます。やはり聞いてみるもんですね、勉強になります。
ちなみに、371のような処理を漏れの環境で比較してみたところ、
ポインタ参照の方が20%ほど高速でした。ポインタの方がスタック処理が
減って・・・とかいう素人考えが当たっていたのかもしれません。
もうちょっと色々と調べてみたいと思います。
388 :
デフォルトの名無しさん:2006/05/02(火) 00:37:24
>>380 C99の規約書か
ネットで調べたら確かに「下線(_)で始まるIDはつけるな」とあった
389 :
デフォルトの名無しさん:2006/05/02(火) 00:39:00
マクロとか言い出すと _ で始まってなくても危険すぎる単語が腐るほどあるな
390 :
デフォルトの名無しさん:2006/05/02(火) 01:07:20
真っ黒
392 :
デフォルトの名無しさん:2006/05/02(火) 01:14:57
>>391 君のところはコーディング規約がないのか?
393 :
デフォルトの名無しさん:2006/05/02(火) 01:20:54
もうやめて!わたしをうばいあうためにあなたたちがあらそうことはないわ!
フヘヘ… こやつめ…
下みたいに、自前でメモリ空間確保してやって、あとは先頭の配列だけ渡すようなプログラムはOKなんでしょうか。
気になるのが構造体で定義したIntのアドレスとかこんな風にコンパイラに任せて大丈夫なんだろうか
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct data{ char *name; int id; }data_t;
typedef struct tf_buffer{ void *buffer_orig; void *buffer; size_t seek; }2ch_buffer_t;
void * 2ch_malloc(2ch_buffer_t *2ch, size_t size);
void *2ch_malloc(2ch_buffer_t *2ch, size_t size){
void *addr;
addr = 2ch->buffer;
2ch->buffer = (2ch->buffer + size);
2ch->seek += size;
return addr;}
int main()
{ 2ch_buffer_t *2ch = (void *)malloc(sizeof(2ch_buffer_t));
2ch->buffer_orig = (void *)malloc(1024);
2ch->buffer = 2ch->buffer_orig;
2ch->seek = 0;
data_t *d = (data_t *)2ch_malloc(2ch, sizeof(data_t) * 6);
int i = 0;
for(i = 0; i < 6; i++){
(d + i)->name = (char *)tf_malloc(2ch, (i + 1) * 15);
memcpy((d + i)->name, (const char *)"test", 4);
(d + i)->id = i;}
return (0);
}
>>395 void* の演算って、OKだっけ?
コンパイル通る?
gcc 4.03だと通るんだけどやっぱりやべぇよなぁと
思いつつ確認したいと思い質問させていただきました。
>>397 まじで?
数字で始まる識別子使えるのか?
まあ、ここに載せるのに置換しただけだとは思うけど。
>>397 VC6でコンパイルしてみたら、サイズが定義されていませんってエラーになった。
ほんとうだ。
識別子が数字で始まってる。
gccおそるべし。
互換性に関するオプションを調べて、指定したほうがいいかも。
4.0.3 ubuntuだと通る不思議だVC6通らない
あ、ちなみに変数名間違って数字にしちゃったみたい本当はwchって
するよていだったゴメン
念のためにVS2003のCでも、ためしたけど、void*の演算はエラーだった。
-ansi -pedantic-errors 付ければ?
C99なら -std=c99 -pedantic-errors
おお、エラーになるな。こりゃいかんな
でこの場合どうするんでしたっけ?
JAVA3年ばかりやっていてこの辺さっぱり
忘れました。悲しくなってきました
えーとchar *で領域とって値を返すときはvoid *にキャストすればいいんだっけ?
たぶんそれでエラーでなくなったからOKなのかな?
>>986 そんな危なっかしいことしないで、memsetとsizeof使いなよ。
それと、sizeの連結にはstrcat使ってさ、それが堅実だよ。
strシリーズはchar*型の独壇場だし。
構造体とかオブジェクトとかの集合なら、
アクセス関数(set()やget())使って、値渡し&returnが理想だけど、
厳しいなら、アクセス関数の参照使って中でOne or 数クッション置いたり、中でカウンター回して、値変化の双方向の影響汲まないといけないんだろうけど。
>>348 できるけど、割り込み禁止した状態で使う
用途に適用するんじゃなければ意味が無い。
100万回繰り返して平均とっとけば十分だろ。
>>348 OSに頼んで自分のCPU優先度を最強にするとかいうのはどう?
またWindowsにはマイクロ秒単位で計測する方法がある。詳しくはWin32APIスレなどで聞け。
いつまでスレ違い野郎の相手をするつもりだヴォケ。
414 :
デフォルトの名無しさん:2006/05/03(水) 05:47:11
>>348 同じ目的に対する複数のアルゴリズムや最適化パターンを比べるつもりなら
本番環境と同じ条件でテストしないと「最速」が変わってしまう可能性があるぞ
特にそういうデカい CPU はキャッシュや分岐予測が速度に大きく影響するから
他のタスクをブロックするとあさってな結果がでる
416 :
デフォルトの名無しさん:2006/05/03(水) 07:05:22
>>406 char* -> void*
はいいが、問題は
void* -> ???*
のときに ??? 型の境界要求を満たすかどうかだ
417 :
デフォルトの名無しさん:2006/05/03(水) 11:29:37
脳足りんの足りんって方言なの?
418 :
デフォルトの名無しさん:2006/05/03(水) 12:32:12
00001498 2FC6 _memset MOV.L R12,@-R15
0000149A 2FD6 MOV.L R13,@-R15
0000149C 2FE6 MOV.L R14,@-R15
0000149E 6163 MOV R6,R1
000014A0 E21F MOV #H'1F,R2
000014A2 6643 MOV R4,R6
000014A4 3122 CMP/HS R2,R1
000014A6 361C ADD R1,R6
000014A8 8F32 BF/S @H'1510:8
000014AA 6D53 MOV R5,R13
000014AC 6063 MOV R6,R0
000014AE C90F AND #H'0F,R0
000014B0 EC01 MOV #H'01,R12
000014B2 30C7 CMP/GT R12,R0
000014B4 6503 MOV R0,R5
000014B6 8F07 BF/S @H'14C8:8
000014B8 3108 SUB R0,R1
000014BA 75FE ADD #H'FE,R5
000014BC 6263 MOV R6,R2
000014BE 76FE ADD #H'FE,R6
419 :
デフォルトの名無しさん:2006/05/03(水) 12:33:40
000014C0 35C7 CMP/GT R12,R5
000014C2 22D4 MOV.B R13,@-R2
000014C4 8DF9 BT/S @H'14BA:8
000014C6 26D0 MOV.B R13,@R6
000014C8 4515 CMP/PL R5
000014CA 8B00 BF @H'14CE:8
000014CC 26D4 MOV.B R13,@-R6
000014CE 65DC EXTU.B R13,R5
000014D0 6753 MOV R5,R7
000014D2 4718 SHLL8 R7
000014D4 257B OR R7,R5
000014D6 6713 MOV R1,R7
000014D8 4709 SHLR2 R7
000014DA 4709 SHLR2 R7
000014DC 6273 MOV R7,R2
000014DE 4208 SHLL2 R2
000014E0 6E53 MOV R5,R14
000014E2 4528 SHLL16 R5
000014E4 4208 SHLL2 R2
000014E6 37C7 CMP/GT R12,R7
420 :
デフォルトの名無しさん:2006/05/03(水) 12:34:47
000014E8 2E5B OR R5,R14
000014EA 8F0B BF/S @H'1504:8
000014EC 3128 SUB R2,R1
000014EE 26E6 MOV.L R14,@-R6
000014F0 26E6 MOV.L R14,@-R6
000014F2 26E6 MOV.L R14,@-R6
000014F4 26E6 MOV.L R14,@-R6
000014F6 26E6 MOV.L R14,@-R6
000014F8 77FE ADD #H'FE,R7
000014FA 26E6 MOV.L R14,@-R6
000014FC 26E6 MOV.L R14,@-R6
000014FE 37C7 CMP/GT R12,R7
00001500 8DF5 BT/S @H'14EE:8
00001502 26E6 MOV.L R14,@-R6
00001504 4715 CMP/PL R7
00001506 8B03 BF @H'1510:8
00001508 26E6 MOV.L R14,@-R6
0000150A 26E6 MOV.L R14,@-R6
0000150C 26E6 MOV.L R14,@-R6
0000150E 26E6 MOV.L R14,@-R6
421 :
デフォルトの名無しさん:2006/05/03(水) 12:35:28
00001510 EC01 MOV #H'01,R12
00001512 31C7 CMP/GT R12,R1
00001514 8B06 BF @H'1524:8
00001516 71FE ADD #H'FE,R1
00001518 6263 MOV R6,R2
0000151A 76FE ADD #H'FE,R6
0000151C 31C7 CMP/GT R12,R1
0000151E 22D4 MOV.B R13,@-R2
00001520 8DF9 BT/S @H'1516:8
00001522 26D0 MOV.B R13,@R6
00001524 4115 CMP/PL R1
00001526 8B00 BF @H'152A:8
00001528 26D4 MOV.B R13,@-R6
0000152A 6043 MOV R4,R0
0000152C 6EF6 MOV.L @R15+,R14
0000152E 6DF6 MOV.L @R15+,R13
00001530 000B RTS
00001532 6CF6 MOV.L @R15+,R12
>>417 足りぬの語尾が撥音便化したものだろう。
どこで聞いたらいいのか分からないんでここで質問させてもらいますが
丸め誤差って必ず実際の値より小さくなりますよね?
丸め方による
どんな丸め方をしても、実際の値より小さくない場合は有ると思う。
実際の値以下でない場合は無いかもしれない。
どうも。勉強します。
427 :
デフォルトの名無しさん:2006/05/03(水) 13:22:11
428 :
質問:2006/05/03(水) 14:38:24
printfやscanfの変換指示文字について
long double型の場合は「%f」であってますか?
誰か教えてください、お願いします。
>>428 printfでは%fがdoubleだが、scanfでは%lf。
scanfでの%fはfloat。
printfで%lfは間違い。float型引数もここではどうせdoubleに格上げされるため。
(いわゆるC99では%lfも認められたが)
>>428 どちらも%Lfだな。
ま、使ってるコンパイラのマニュアル見たほうが正確。
431 :
428:2006/05/03(水) 14:50:28
>>429 /* test.c */
#include <stdio.h>
int main()
{
double d = 1;
long double Ld = 1;
printf("d = %f\n", d);
printf("Ld = %f\n", Ld);
return 0;
}
このプログラムの実行結果が
d = 1.000000
Ld = 0.000000
になってしまうのですがなぜだかわかりますか?
433 :
428:2006/05/03(水) 14:54:54
>>430 %Lfだと
d = 1.000000
Ld = 0.000000
なってしまします。
>>432 %1.0fだと
d = 1.000000
Ld = 0
になってしまいます。
434 :
デフォルトの名無しさん:2006/05/03(水) 14:55:28
ハッシュ法のことで質問なのですが
探索・挿入・削除などの作業時に際して
空き領域に到達するとなぜ失敗ということになるのでしょうか?
あとハッシュ法の意義があまり分からないのです…
435 :
429:2006/05/03(水) 14:57:03
_| ̄|○
寝ぼけてた
>>431 (C99)規格ではおそらく%Lf。
但し、それをサポートしてるかどうかは
使ってるコンパイラのマニュアル確認するのが確実。
>>434 ハッシュ機能の関数は次のよう
hoge HASH(foo,・・・){
//文字列aをアドレスに変換
//対象のメモリのアドレス値を返す
}
だから、アドレスが見つからないと0xCCを返したりして、エラーになる。
ハッシュ法の意義>インデックスみたいなもんだよ。高速検索機能。
>文字列aをアドレスに変換
値渡しor参照渡しされた文字列をアドレスに変換
なぜ唐突に0xCCが出てくるかわからない。
例えば、文字列"HASH"をハッシュ関数を通すと、
[昔はハッシュ機能を使ったキャッシュ機能(ハード、CPU)もあったらしいけど、]
頭がHで始まる内容を持ったアドレスを返したって絞り込めている。
これは、いわゆるソートが掛かっている場合だけど、
データ集合にインデックス項目作って、インデックス機能を作ればソートかかって無くてもいける。
Cで作ったバイナリで値なしは0xCC・・・で埋められることが多い。
>頭がHで始まる内容を持った先頭アドレス
>>434 "空き領域"とは何のことを指しているのかがわからなければ答えようが無い。
>>441 もしかして、変数を初期化しないで使ってないか?
VCあたりで。
>>440 本人も意味が分かって書いてるのだろうか。
>348
一万回ぐらい同じ処理を実行して、平均取ればいいじゃないか。
今C習い始めなんですが(学校で)、
漸化式の次の項ってどうやって表示すれば良いんでしょうか?
前の項と次の項の差を出したいんですが・・・
http://wisdom.sakura.ne.jp/system/winapi/win32/win6.html 上のほうはVisual C++ 2005 Express Editionで実行できません
なんで?
#include<windows.h>
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {
MessageBox(NULL , lpCmdLine , TEXT("Kitty") , MB_ICONINFORMATION);
return 0;
}
449 :
448:2006/05/03(水) 19:19:50
------ ビルド開始: プロジェクト: win01, 構成: Debug Win32 ------
コンパイルしています...
winmain.cpp
c:\documents and settings\裕\my documents\visual studio 2005\projects\win01\win01\winmain.cpp(8) : error C2664: 'MessageBoxW' : 2 番目の引数を 'PSTR' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
ビルドログは "file://c:\Documents and Settings\裕\My Documents\Visual Studio 2005\Projects\win01\win01\Debug\BuildLog.htm" に保存されました。
win01 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
450 :
デフォルトの名無しさん:2006/05/03(水) 19:23:27
>>448 このスレで聞きたければ
拡張子を .c にしてやり直しておいで
452 :
448:2006/05/03(水) 19:28:02
dクス
.Cにしたらできました。
>>451 コソパイルオプション?
453 :
448:2006/05/03(水) 19:31:15
winmain.c(8) : warning C4133: '関数' : 'PSTR' と 'LPCWSTR' の間で型に互換性がありません。
ビルドできますがこう出ます
>>452 プロジェクトのプロパティでMBSとかUNICODEとかを指定するところない?
455 :
448:2006/05/03(水) 19:36:30
>>454 dクス
文字セットを
マルチ バイト文字セットを使用する
に変更したら警告が出なくなりました。
よかったよかった
>418-421
これってなに?
ダンプ松本
458 :
デフォルトの名無しさん:2006/05/03(水) 20:00:16
逆汗
文字列を二桁ずつで区切ることは可能ですか?
例えば11223344みたいな文字列があったとして、"11"で変数に格納"22"で変数に格納、みたいな感じです。
11と22と33と44を個別に変数に格納したいんです。
460 :
デフォルトの名無しさん:2006/05/03(水) 20:03:13
strncpy
461 :
459:2006/05/03(水) 20:12:12
strncpyは
この二つだけを取り出す
. ↓↓
□□□□□□□□
上の図のように取り出すことは不可能ですよね?
何のコンパイラなんだ?>418-421
共用体はどうか?
デリミタが無いが、いまどきの文字列操作は範囲指定するそうだからいけるだろう。
464 :
デフォルトの名無しさん:2006/05/03(水) 20:16:26
>>461 main()
{
static char s[] = "abcdefgh";
char u[3];
strncpy(u, s + 3, 2);
puts(u);
}
465 :
459:2006/05/03(水) 20:17:17
>461
strncpy(dest,src+ofset,lng)
467 :
デフォルトの名無しさん:2006/05/03(水) 20:21:34
>>465 そんくらいやってみろよ、まったく・・・
>465
君はCを使わない方が幸せになれる部類のお人だ
469 :
459:2006/05/03(水) 20:31:47
俺もそうだ。安心しろ。
>467-468
そうは言うが、
&s=s=s[0]を理解するのは結構苦労したぞ>自分の場合
アドレス加算は言われてみればそうだけど、最初気付かないのは誰でも通る道じゃないか?
&s=s=&s[0]
473 :
デフォルトの名無しさん:2006/05/03(水) 20:40:22
char[] str
str ~= "nullpo"
相変わらずレベル低いなw
&s と s は等しくないと思うんだけど。
その代入は正しくないのう
>>447 おねがいします_| ̄|○
x=x+1
のように漸化式を解いていく過程で前の項と後の項との差を出したい
んですがどうやっても差が出ないんですが・・・
低レベルですいません
ポインタで悩むのは誰でも通る道だが、
ポインタを理解せずに文字列操作をするのは危険だ。
低レベルでも謝る必要は無いが、
題意がさっぱりわからん。
>>477 その場合は、1が差じゃないのか?
x = x + nの形だったら n。
>>477 後ろの項はそのまま代入すればいいだろうが、
前の項を求めるには方程式を解かねばならない。
482 :
デフォルトの名無しさん:2006/05/03(水) 20:56:29
頼む、C言語って何なんだ?kwsk頼むwww
Delphiのプラグインだっけ?www
>>480 それをプログラムで表示させたいんです。
|x(n+1) - x(n)|
をプログラムで求めたいんです(つд`)
int dif(int x){
x=x+1;
return x-x;
}
485 :
デフォルトの名無しさん:2006/05/03(水) 20:59:51
意図がわからんが、
x2 = x + 1;
printf("%d\n", x2 - x);
x = x2;
あえてやろうとしたらこんな感じか?
お前ら初心者に嘘を教えて何が嬉しいんだ?
int* dif(int n){
int ans;
ans = x(n+1) - x(n);
if(ans < 0)
ans = - ans;
return &ans;
}
違った答えが出ることもあるが、
大抵はうまく動くから気にするな。
488 :
デフォルトの名無しさん:2006/05/03(水) 21:10:01
>>471 まだまだ苦労が足りないようだな
>&s=s
お前んとこのコンパイラは
if(&s == s) puts("aho");
を黙って通すか? (黙って通す処理系を知っているが)
>s=s[0]
問題外
printf("%d", sizeof s);
printf("%d", sizeof s[0]);
>>484 main関数だけのしかまだやってないので理解が出来ません…
>>486 0になってしまいました…
>>487 >ans = x(n+1) - x(n);
のところはどうしたら良いんですか?(゚∀゚)
課題をここにコピペ出来ないか?
492 :
403:2006/05/03(水) 21:36:21
そうすると本当にスレ違いになる
>>491 x(n+1) = 0.5*[x(n)+(s/x(n))], x(1)=3, s = 9.869004
の漸化式の収束点を|x(n+1)-x(n)|<10-5の精度で求めよ。
ってヤツなんですが自分の考え方がおかしかったですか?(^_^;)
n=4ですでに収束してる。<10-5の精度
n<4で問題が発生してるなら、x(n)を整数で扱ってるとか?
double s=9.869004
double x=3;
double dif;
do{
dif = x;
x = 0.5 * (dif + s / dif);
dif -= x;
if(dif < 0) dif = -dif;
}while(dif > 0.00001)
>>493 前の項を求める必要ないじゃん。
プログラミングで収束値を求める場合は、与えられた漸化式が収束値をもつことと
求められた収束値を計算の誤差も含めて上下から 10^(-5) 抑えられることを書いとくと好感度Upだよ。
きっと。
497 :
デフォルトの名無しさん:2006/05/03(水) 21:56:36
アセンブラ使えよ・・・
>496
気持ちはわかるが、それでは課題に答えたことにならないから0点。
>>496 そうなんですか?!それはすみませんでした(^_^;)
それで、|x(n+1)-x(n)|<10-5になったときに無限ループ
が終わるようにはどうやってすれば良いんでしょうか_| ̄|○
>>487 >return &ans;
アドレス参照を返してどうしようと?
返すと同時に(関数終わると同時に)消えるよ、この値。
501 :
デフォルトの名無しさん:2006/05/03(水) 22:15:58
いかにもな釣りだな
>>487 どうしてもやるなら、
int* dif(int n) const{
か
classのメンバ関数にしたほうがいいんじゃないかな。
classの動的オブジェクトはfreeするまで消えないから。
>>496 しいて言えば、n=Nで収束と判断した場合、x(N)/(10^-5)が52bitに収まる事は示す必要がある。
>>502 藻前はまず、スレタイを1000回ほど朗読した方がいい
505 :
デフォルトの名無しさん:2006/05/03(水) 22:21:20
>>502 おまえうざい
釣りならもっとマシなのやれアフォ
>>504 このさい、
extern "Cplusplus"
だっていいだろうw
507 :
デフォルトの名無しさん:2006/05/04(木) 00:08:16
Windows XPでC言語やりたいのですが何から始めればよいのですか?
無料でできるのでしょうか?
>>507 マイクロソフトやらボーランドが無料コンパイラを配布してる。
コンソールでいいなら、Cygwinとかも。
ぐぐれば解説は山ほどでてくるんじゃね。
510 :
デフォルトの名無しさん:2006/05/04(木) 00:14:06
>>507 ・Windows XP
・無料
上記2点を満たす選択としては
・Borland C++ 5.5.1
・cygwin (オプションで GCC を指定)
あたりが有名どころ
Borland は憶えることが少なく済むがリリース年度が 2000 年と古く C99 未対応
cygwin 上の GCC は全く逆だが、やるなら同じく無料の Fedora か CentOS を使った方がしっくりいく
511 :
507:2006/05/04(木) 00:20:38
>>508-
>>510 即レスありがとうございます!!
そしてVisual C++ 2005 Expressはダークホースかと思われたが、
Windowsプログラミングに当たっては欠けているものが多すぎでスレの勢いは落ちた。
でもCの勉強をする分には十分過ぎる程だよ。
513 :
403:2006/05/04(木) 00:36:59
まず、VMware入れてUbuntu Suse Cent Fedora 当たりをインスコする
gcc 3.3.xから4.x当たりを入れて後は書きたいだけソースかけ
糞Winなんてあと3年したら無くなるから勉強するな意味ない
LinuxなんぞCDからブートすりゃいいじゃん
>>513 残念ながらたった3年で消えるほど世の中単純ではない。
もちろんWin APIのことだとしてもだ。
GCCを使う場合は、-Wallと-pedantic-errorsを忘れないよーに
Win32APIよりクライアントサイド.NETのほうが先に消えると思う
Win32APIが消える?
その時は、WINDOWSアプリが消えるときだぜ、すなはちWINDOWSが消えるときだ。
VCにとどまらず、VBでも使ってる。
>>518 そりゃ.net以前のwinアプリは、全部使ってるがな。
>>519 .net使ったことないが、あの「COMのマガイ物」みたいなエタイの知れないものがよく分からん。
どうも話によると、VCとVBとJAVAをつなげれるらしいが、要は開発環境選ばないらしい。
あ、もちろんWIN限定で。
関数型マクロがわかりません!
#define MAKEPOINTS(l) (*((POINTS FAR *)&(l)))
このマクロはlの、
上位ビットをy座標としてPOINTS構造体のyに、
下位ビットをx座標として構造体のxにいれて結果を返すみたいです。
ですがなぜそのようになるかわかりません。
これはどのように見たらいいのでしょう?
環境依存の話はWindowsプログラミングのスレにどうぞ
いやいや、そうじゃなくて別にMAKEPOINTSじゃなくてもいいのよ!
ただ単に今触ってたマクロがこれだっただけで・・・
自分が知りたいのは「関数型マクロ」の書き方なのです。
教えてください、お願いします。
>>521 lは上位バイトにy座標、下位バイトにx座標が入っている4バイトの整数型であることを想定している。
POINTSは2バイトのメンバ変数を2つ(x, y)持ち、上のような整数型の変数をPOINTS *型として読むと、
ちょうどx, y座標にぴったり値が当てはまっている。
そのような操作をマクロにまとめたのが、MAKEPOINTS。
上位ワードと下位ワードだった、スマン。
動的に関数を生成することはできませんか?
JavaScriptなどのクロージャのようなものがあればよいのですが。
var obj = new Object;
var func = function(){ return obj; }
>>523 ここであなたが勉強すべきなのはマクロではなくて
キャストの意味です
>>526 動的に生成することはできないけれど、関数を差し替えることはできる。
#include <stdio.h>
int f1(){ return 1;}
int f2(){ return 2;}
void main(){
int (*f)(void);
f = f1;
printf("%d\n", f()); // 1
f = f2;
printf("%d\n", f()); // 2
}
C言語の話?になるかどうか分からないけど
光エレクトロニクス(光素子と仮定し以下参照)
フォトダイオード
フォトトランジスタ
レーザー
発光ダイオード
に関する仕様設定プログラムとかってあります?
光制御プログラミング[Cでの]というイメージなのですが。
プログラミングをどうやるか?じゃなくて存在の有、無と
その例(どのようなに使われているか)が知りたい。
どう見てもC言語の話じゃないだろ
「C言語の話かどうか分からない」って頭狂ってるんじゃないのか
こっちのほうが意味が分かりやすいかもしれないな
#include<stdio.h>
#defineyourFile"c:/windows/デスクトップ/新規テキスト文書 (7).txt"
#defineLENGTH_AS_YOU_WISH100
voidmain(void){
intcch=1;
int*ch=&cch;
FILE*fp=fopen(yourFile,"r");
charbuf[LENGTH_AS_YOU_WISH];
fgets(buf,sizeof(buf),fp);
fclose(fp);
for(ch=&cch;*ch;++ch){
printf("%#02x ", *ch);
}
}
>>533 ニヤニヤされちゃった(テヘッ;
OSばればれだね
久々みたぜ
void main(void)
void main()
538 :
デフォルトの名無しさん:2006/05/04(木) 16:07:51
539 :
デフォルトの名無しさん:2006/05/04(木) 17:15:17
540 :
デフォルトの名無しさん:2006/05/04(木) 17:39:49
なんだと!
そもそも、電源投入後mainに入り、二度と戻らないようなプログラムの場合
void main(void)だったりする・・・ITRONなどはそうなっている。
まあ、main()がなくても動くけどね。
べつにどうでもいいことだと思うが・・・>main
それでどうこうなるわけでもないし。馬鹿みたい。
こんな細かいことにこだわって本質を見抜けない人が多いよね。
bash や make から呼んだ時に困る。
本質的に
規格で決まってるのに
どうでもいいって
馬鹿みたい
mainの戻り値を使ったことが無い人なんでしょ
使ったことないなぁ
とりあえず漠然と正常終了で0、エラーで1だか非負を返してるだけ
組み込みプログラムとそうでないのではmainに対する考えが違うのでは?
私は、組み込みで、電源投入後からハードの初期設定やらカーネルの初期処理でタスクの生成や起動
やらの部分を作成してます。
mainについてはNORTiというOSではvoid main(void)という仕様になっています。
非負じゃなくて火零でした
>>549 そんな事は問題では無い。
mainはintという仕様なのだよ。
│ ≡ ('('('('A` )
│≡ 〜( ( ( ( 〜)
↓ ≡ ノノノノ ノ
>>551 こいつ void 並の頭の固さじゃね?
ということにしたいのですね
いやvoidはやわらかいとおもうぞ
と思ったけどやわらかいのはvoid*か
C言語の規格では、int main(int, char**); と int main();
を使えることは最低要件となっているが
その他の型のmain関数を定義できてもいいことになっている
そもそも組込の開発環境の話をしている相手に対して標準規格ではどうこう言っても(ry
int a = 100;
や
char str = "num = 100";
の100を#defineで一括で置き換えするうまい方法ってないでしょうか
要するに数値とその文字列を一つの#defineで置き換えるという。
つ[トークンの文字列化]
分からんって事はC FAQ読んでない証拠
11.17辺り。
すんません、プリプロセッサのところだけしか見てませんでした
562 :
デフォルトの名無しさん:2006/05/04(木) 23:01:45
>>545 ファームウエアを make から呼んでみろドアホ
563 :
デフォルトの名無しさん:2006/05/04(木) 23:02:49
>>557 言わないでやれよ
(・∀・)ニヤニヤしようぜ
565 :
デフォルトの名無しさん:2006/05/04(木) 23:29:15
>>564 反論できないことはよーくわかったよ(プ
流石GW
567 :
初心者:2006/05/05(金) 02:12:54
もう,かれこれ一週間くらい調べたりしてわからないんですが
datファイルで
1|xxxxx|yyyyy|zzzzz|nnnnn|mmmm
2|xxxxx|yyyyy|zzzzz|nnnnn|mmmm
:
:
のように書いたものがあるんですが
そのファイルから
1|yyyyy|nnnnn|
:
:
のようなものを作りたいのですが
こういった場合,何をどういう風に使えばいいのでしょう.
教えてください,よろしくお願いします.
これでOK
int i;
for (i=1; i<100; ++i) {
printf("%d|yyyyy|nnnnn|\n", i);
}
>>569 cut -d '|' -f 1,3,5
571 :
デフォルトの名無しさん:2006/05/05(金) 04:49:19
strtok()
572 :
デフォルトの名無しさん:2006/05/05(金) 04:50:40
sscanf()
>>567 select yyyyy, nnnnn from dat
gawk '{ print $1, $3, $5 }'
575 :
初心者:2006/05/05(金) 10:16:27
みなさん、ありがとうございます!
試してやってみます!
その後報告させていただきます。
ホントかよ
577 :
デフォルトの名無しさん:2006/05/05(金) 12:59:26
マジレスするとfgets()なりで一行読み込んだあとstrtok()で区切り文字を|にして分離して変数に読み込んだ後fprintf()で出力。
strtok()って最近は問題ないの?
>>578 今も昔も静的領域を利用することに変わりはないから要注意であることには変わらないよ。
#勿論スレッドアンセーフだし。
>>579 最近いろいろな所でstrtok()見かけるようになったから仕様が変わったのかと
思ってたら、変わってなかったのね… (((( ;゜Д゜)))ガクガクブルブル ((((
581 :
デフォルトの名無しさん:2006/05/05(金) 14:31:44
あの言語仕様だと変えようがないだろ
strtokにかわる関数を用意するならともかく、仕様は変えないだろ。
583 :
デフォルトの名無しさん:2006/05/05(金) 16:06:43
すんげ簡単だから誰も騒がないだけ
584 :
デフォルトの名無しさん:2006/05/05(金) 16:11:22
scanf()gets()と一緒で教科書にしか出てこない関数だ
585 :
デフォルトの名無しさん:2006/05/05(金) 16:17:54
一番短く
>>567をcで実装したら何行になるかな
シェルやawk.perlでは1行ですむが
586 :
403:2006/05/05(金) 16:25:34
strjpok(?)使えばいいのか
VC 2005 では危険な関数に関して
安全にした別の関数を独自に用意してたような。
関数について
void test(int hoge[]);
と
void test(int *hoge);
は同じ?
うん
590 :
デフォルトの名無しさん:2006/05/05(金) 19:41:26
>>588 同じ
int a[2];
1[a]=2;
でもOK
592 :
デフォルトの名無しさん:2006/05/05(金) 20:00:26
cの配列はポインタの略記法という意味
593 :
デフォルトの名無しさん:2006/05/05(金) 20:11:21
小さな言葉のアヤが致命的な誤解へとつながっていく >「角括弧」と「配列」
>>590 void test(int hoge[16]);
と
void test(int *hoge);
は同じ?
597 :
デフォルトの名無しさん:2006/05/05(金) 21:14:36
ワーニングが出る
違う
601 :
594:2006/05/05(金) 21:46:43
>>592 型における [] や * と
式における [] や * は
全く別物だ。
>>587 Safer C(Secure Cだっけ?)のフライングみたいなヤツでしょ?
606 :
デフォルトの名無しさん:2006/05/05(金) 23:51:42
どっちだ!
あさっての方角だ。
str[i] == *((str) + (i))
>>590(=
>>592?)
勉強し直した方がいいよ。
・関数の仮引数中における最外の[]は*と等価
と言うのと
・a[1] は *(a+1) のシンタックス・シュガーである
と言うのは、全くの別物。
コンテキストによってトークンの意味がかわってしまうのは
Cのうんこな欠点のひとつ
staticとか
perlなんざ七色変化ですがな。
それは欠点じゃない。
無駄にキーワードや演算子が多い方がむしろ良くない。
これは言語設計の1つの指針だ。
それに、
>>609 はトークンの意味が変わるという程は
意味は変わってない。違うのは確かだが。
別な文法にした方がむしろ混乱する。
> ・a[1] は *(a+1) のシンタックス・シュガーである
シンタックスシュガーじゃないだろ。
>>613 シンタックスシュガーだよw
a[b] は *(a+b) のシンタックスシュガーだ。
*(a+1) は a[1] とも 1[a] とも書けるからやってみそ。
但し、a, bいずれかがポインタであり、残りが整数型に変換可能である必要はある。
616 :
デフォルトの名無しさん:2006/05/06(土) 16:47:10
C言語の、初心者にも分かる一番良い参考書って何?
古いといわれるかも知れんが、
K&Rを薦めたい。
ANSIと違うが、たいていのコンパイラは対応しているから気にするな。
GUIは"猫でも"で並行学習だ。
618 :
デフォルトの名無しさん:2006/05/06(土) 16:58:23
自動変数を関数の戻り値にしてはいけないとよく言われますが
構造体を返しても大丈夫ですよね?
619 :
デフォルトの名無しさん:2006/05/06(土) 16:59:08
ありがとうございました。
CもC++もWinAPIもGUIもクソ味噌にしてる奴が多いな
>>615 まあ、それは *(a+b) でも一緒だし。
CUIではつまらないだろう?
ただ、GUIにはイベントドリブンという壁があるな。
こいつは新言語を習得するのと同じくらいクセモノだ。
俺だったらWinプログラミングじゃなくてUNIXプログラミングを薦める
もしくはJava
薦めるのはいいがスレ違いになると教えておけよ
ここは聞くほうも答えるほうもC以外に傾きやすい
>>614 「シンッタクスシュガー」の意味わかってんのかよ。
>>618 効率云々の話は別にして、構造体を返してもOK
>>626 おれは614じゃないけど
糖衣構文のことだろ、問題ない
>>618 つーか、自動変数を返すこと自体は全く問題ない。
問題なのは、自動変数のポインタを返すことだ。
間違いやすい点としては、配列を返すことはできないので配列を返す積もりでポインタを返すケースだな。
630 :
デフォルトの名無しさん:2006/05/06(土) 18:34:20
今C言語の勉強してるのだが、数年前の古い参考書を元に
勉強しているので、gotoとか出てきます。
gotoって確か廃止された命令だと風の噂で聞いたんですが、
勉強する必要って有るのですか?
>>630 使えれば便利なこともある。
でも後藤さんがあまり人気が無いのは確かだ
真のC使いはgotoを恐れたりはしない。
>>630 昔も今も廃止されてはいないが、一般的には非推奨。
gotoを説明している項目以外でgotoを頻繁に使っているのなら、
その本を読むのは考え直すべき。
634 :
デフォルトの名無しさん:2006/05/06(土) 18:40:26
インクルードファイル<stdio.h>がオープンできない
っていうエラーはどう解決したらいい?
ほとんどCを知らない初心者でスマソ
>>634 もう一回インストールし直す。俺も昔それがあってちょっとあせった
ソースと同じ場所に置いて
#include "stdio.h"
とする。
637 :
デフォルトの名無しさん:2006/05/06(土) 18:48:34
インストールしなおすって何を?
頭の中を
スタジオを
641 :
デフォルトの名無しさん:2006/05/06(土) 18:55:22
ゲーム制作で使う自作スクリプトの字句解析プログラムを作ってます。
1トークンが何文字になっても良いように
char *型の変数にrealloc(1)で領域を拡張しながら
1文字ずつ格納していき、トークンが完成したらファイルに吐いてるんですが、
書き込み用ファイルをオープンするところで異常終了してしまいます。
いろいろ試したところ、トークンが4バイトより大きくなる(例えば abcde とか あいu)
と異常終了するようです。
char *型に1バイトずつ動的割り当てした時の4バイトより後の領域が
一見関係なさそうなファイルオープン時になんらかの影響を与えていると
勘ぐっているんですが、そういう事なのでしょうか?
OS:WindowsXPsp2
コンパイラ:BCC
よろしくお願いします。
642 :
デフォルトの名無しさん:2006/05/06(土) 18:59:11
>>641の訂正。
reallocの引数が足りてませんでした。
realloc(char * c,int length)です。
デバッカで追っている間は、意図したように文字列が
作成さているようです。
水をさして悪いがflexとかを使った方が・・・
そのchar * cは気になるな〜
構文を調べてから使いなされ<realloc()
>>641 ソースを見ていないから何とも言えんが、
最初のポインタ変数を、ちゃんと NULL とかで
初期化していないんじゃないのか?
まず realloc の使い方をしっかり調べとけ。
647 :
デフォルトの名無しさん:2006/05/06(土) 19:06:24
>>643 お気遣い恐れ入ります。
しかしなんというか、自分で作ってみたいんですよ。
C言語面白くて。
正直、とりあえずゲームは二の次って感じなんです。
>>646 レスありがとう。
初期化はしています。
デバッカでも直前はNULLになっています。
ちゃんとrealloc()の戻り値を使用しているか?
で、そのポインタを realloc に渡しているか?
realloc の戻り値ををちゃんと再設定しているか?
c = (char *)realloc(c, newlength)
651 :
デフォルトの名無しさん:2006/05/06(土) 19:16:07
>>648 使用していませんでした。ごめんなさい。
あなたのレスとC言語辞典をよく見かえしたらなんか理由が分かったような。
ちょっとやってみます。ありがとう。
char* c について
最初はNULLまたは正規の関数で取得したアドレス。
途中は非NULLチェック必須。
GUIの質問はここでよろしいですか?
いまどきはCもGUIでないと流行らんからな・・
どんとこい。
655 :
デフォルトの名無しさん:2006/05/06(土) 19:25:21
>>654 ありがとうございます。
HDC hdc;
RECT rc;
char *szStr="hello,world";
switch (msg) {
case WM_PAINT:
GetClientRect(hWnd,&rc);
hdc=BeginPaint(hWnd,&ps);
DrawText(hdc,
(LPCTSTR)szStr,
-1,
&rc,
DT_WORDBREAK);
EndPaint(hWnd,&ps);
hello,worldと表示することを意図して書いてみたのですが、コンパイルしてみると、表示が文字化けしてしまいます。
どうすればちゃんと表示できるでしょうか?
コンパイラはVisual C++2005です。
LPCTSTR szStr = _T("hello, world");
にしてみ。
>>656 _T識別子が見つかりませんでしたってエラーが出て来ました。そうすればいいのでしょうか?
変なところは無いが・・
メッセージループ前後を省略しているが、ここ以外におかしいところが有ると思う。
#include <tchar.h>
>>660 ありがとうございます。
出来ました。
お答えいただいたかたがた本当にありがとうございました
663 :
641:2006/05/06(土) 20:09:50
641です。
解決しました。
勢いで書いたところを中心にもう一度よぉぉく見返したら
明らかなメモリ破壊コードを書いてました。
くだらないオチで本当にお恥ずかしい。
今回はreallocの使い方が直接の原因ではなかったけれど、
それも十分危険なコードであると知りました。
レス下さった方ごめんなさい。そしてありがとうございました。
>>630 gotoを勉強する必要があるようなら、先は長いな。
学ぶ必要も何も5分で覚えられると思うが・・・
使うかどうかは別として
gotoを勉強する必要が無いようなら、先は短いな。
でも後藤さんって形としてはすっきりした形で終わらせてくれるよね。でも俺は後藤さんは嫌い
longjumpしかつかっちゃいけない
うちの環境なんとかしてほしい
ポインタについて質問です。
A. ポインタという一種入れ物があって、その中に何かを代入できる
B. ポインタとはメモリに貼り付けるラベルのようなもので、入れ物ではない
今までずっとAが正しいと思っていたのですが、最近になってBかもしれないと思うようになりました。
前者の場合、ポインタの中に何を入れようとも(ポインタが空であろうとも)
ポインタ自身がメモリの中の一定位置に存在することになり、
後者の場合はポインタの指し示すアドレスによってポインタの位置もコロコロ変わる様なイメージです。
B であってますでしょうか?
>>669 どっちも違うような・・・
>ポインタ自身がメモリの中の一定位置に存在することになり
存在してますよ、
>指し示すアドレスによってポインタの位置もコロコロ変わる
それはないですよ
>>669 ポインタ変数という一種入れ物があって、
その中にポインタを代入できる
goto ポインタ
という手法は最近一部で流行っている。
アセンブラとかやってない世代は、ポインタについてどうやって理解していくべきだと思う?
普通は、C言語を使っているうちにだんだんと慣れていって、実感が湧いてくるもんだよなあ?
アセンブラやればいいじゃん。
インラインアセンブラでいいから。
アセンブラでなくとも、ポインタは自然と身につく。
たとえば、BASICでもポインタの概念は必須だった。
F-BASIC限定だが、文字列変数名=文字列の先頭アドレス
その他のMS系BASICでも、変数のアドレスを得る関数は有った。
どんな言語でも、データのアドレスという概念無しで
出来ることはたかが知れている。
>>656 TEXT("hello, world")
>>669 どちらでもない。
ポインタとは、プログラム中に使用するオブジェクトを指し示す値の事。
規格では「ポインタ」はどう定義されてるの?
後藤ポイントのテクニック書いたページってどこだっけ?
682 :
デフォルトの名無しさん:2006/05/06(土) 23:20:27
質問ですが。
C言語覚えるとどんないいことがありますか。
ハッキングできんの?
ポインタ != アドレス
なわけだが、たいていの実装は
ポインタ == アドレス
>>C言語覚えるとどんないいことがありますか。
何も無い
しいて言えば、Cを使いたい時にCが使えるだけ
>>ハッキングできんの?
努力次第(Cに限った事ではない)
>>683 実装の段階で
ポインタ != アドレス
って、どんな時?
686 :
デフォルトの名無しさん:2006/05/07(日) 00:00:28
型と値の違いもわからないアフォがいるづら
>>685 JAVAとかのへんな糞思想入って
ごっちゃになってるだけじゃね?
688 :
683:2006/05/07(日) 00:28:34
書き方が悪かったか
でもまぁいいやアホの戯言はスルーしてくれ
689 :
sage:2006/05/07(日) 00:42:17
すいません。
swith文で、 \ を判定するには、どうすればよいのでしょう?
以下のように書いたのですが、うまくいきません。
switch( *ss ){
case '\\';
...
}
case '\\':
691 :
689:2006/05/07(日) 00:45:44
>690
すいません。
';'は':'のタイプミスです。
なお、コンパイルしてもエラーは発生していません。
>>689 それだけ見ても、どう巧くいっていないのか判らない。
もう少しはっきりと判るコードの断片か状況説明をしてくれ。
#まさかbreak;してないって落ちじゃないだろうなぁ。
コード一行も変更せず載せろよ
話はそれからだ
typedef WCHAR TCHAR , *PTCHAR ;
このカンマの意味何?
同時に宣言してるだけ
typedef WCHAR TCHAR;
typedef WCHAR *PTCHAR;
と同じ
int a, b;
このカンマと同じ。
697 :
694:2006/05/07(日) 00:58:25
どうもありがとう
>>689 #include <stdio.h>
main(){
char a = '\\';
switch(a){
case '\\': puts("This is \\.");
}
}
これで
This is \.
と表示される
うまくいかないのは別の部分にあるはず
699 :
689:2006/05/07(日) 01:05:21
すいません。
コードを以下に載せます。
作っているのはkernel printf関数です。
改行を行いたいのですが、case '\\':の中に入れないようです。
for(sss = s2, ss=format; *ss; ++ss) /* formatの先頭から末尾まで */
{
s_chk = ss;
switch(*s_chk){
// '\\'が使えないのか?
case '\\':
++ss; /* \ だったら、その直後の文字に応じて出力 */
switch( *ss )
{
// 改行
case 'n':
++ss;
putfonts8_asc(binfo->vram, binfo->scrnx, disp_x, disp_y, COL8_FFFFFF, sss);
disp_x = BLANK_LEFT;
disp_y += FONT_HEIGHT;
memset(s2, 0, sizeof(s2));
break;
}
break;
default:
memcpy(s, ss, 1);
++s;
break;
}
}
単に
case '\n':
で改行取れるんちゃうん?
'\n'で一文字。
701 :
689:2006/05/07(日) 01:16:20
すみません、自己解決しました。
関数に渡している引数が悪かったです。
'\n'って、'\'と'n'の2文字として扱われるんじゃないんですね。
勉強不足でした。
>>701 > '\n'って、'\'と'n'の2文字として扱われるんじゃないんですね。
うむ
\nってのはあくまでも改行をソース中に記述するための記号
703 :
689:2006/05/07(日) 01:23:37
すみません、自己解決しました。
関数に渡している引数が悪かったです。
'\n'って、'\'と'n'の2文字として扱われるんじゃないんですね。
勉強不足でした。
704 :
689:2006/05/07(日) 01:32:53
>702
勉強になりました。
2重書き込みしてしまい、すみませんでした。
705 :
デフォルトの名無しさん:2006/05/07(日) 17:02:52
マクローリン展開方式を使ってsin30,60,90,120,150,180度に対するsin関数の値を
一回の実行で求められるプログラムを作りたいんですがどうしても出来ません。
どなたか馬鹿な私に教えてくださいm(_ _)m
706 :
デフォルトの名無しさん:2006/05/07(日) 17:22:58
ファイルIOについて質問なのですが
ファイルの読み込みってEOFが戻ってきたらファイルの終端ですよね?
OSによって違うのかも知れませんが私の環境では-1と定義してあります。
ファイルのデータの中に-1に該当する値が含まれていたら
while((c = getc(fp)) != EOF)
{
}
みたいなコードって途中で止まっちゃわないでしょうか?
fgetc() は、 stream から次の文字を unsigned char として読み、 int にキャストして返す。ファイルの終わりやエラーとなった場合は EOF を返す。
charとintが同じサイズの環境だとどうなるんだろう。
とふと思った。
1回目は'-'に相当する0x2Dを返す
2回目は'1'に該当する0x21を返す
俺釣られたんだよね?
>>708 charは1byteだし
intは最低2byteじゃなかったっけ?
711 :
デフォルトの名無しさん:2006/05/07(日) 17:40:31
>>710 intは最低16ビット。
で、
sizeof char == 1
sizeof int == 1
CHAR_BIT == 16
なんつー環境があるんだが、こういう場合はどうする?
環境が分かってるのならEOFがどうなってんのか見てみる。
>>714 今家だから確かなことはわからんけど、多分そんなもんないと思う。
で、もしそういう環境でCの標準環境を整えるならどうやるのか疑問に思っただけ。
char_bitが16ならそのまま返せばいいんじゃね?
ASCII文字は1byteに収まるわけだし
多分まともなCを作るなら
>>713みたいな定義を
しちゃいけないような気がする。
8ビットアクセスに手間が掛かるとしても、
CHAR_BIT==8にしておくべきなんじゃないか。
>>716 getc()はASCII文字を返すって決まってるの?
UTF-32を返す場合もあるよ
>>713みたいな定義をするなら
なんか1文字削ってEOFに割り当てるくらいかなぁ
ファイルの途中にEOFにあたるものが使われてたらエラー扱いで。
バイナリモードのときどうする?
そう考えるとsizeof (int) == sizeof (char)はありえないな。
>>717 現に定義はそうなってるし、CHAR_BITが8以上の環境も存在する。
724 :
デフォルトの名無しさん:2006/05/07(日) 18:45:28
>>723 たとえば?
CHAR_BITが16の環境ってintが32なんじゃね?
>>715 標準に準拠したコンパイラ導入すればいいだけでは?
char,short,int,longが全部32bitの環境もあるらしいよ。
>>723 CHAR_BITが8じゃないのはこの際どうでもよくて、
intとcharのサイズが一緒ってどうよって話。
CHAR_BITを出したのは、
>>710みたいな突込みがあるから。
>>710は間違ってたけど。
0〜255の256種類の数値を返す訳だから、sizeof char==sizeof intでも問題ない。
要は、0-255と-1が表せればいいわけだね。
>>706 そういうわけで、fgetc()の戻り値はintになっている。
731 :
デフォルトの名無しさん:2006/05/07(日) 20:15:19
>>730 , all
どうなるかはらはらしていました。
ありがとうございます。
安心してintを使います。
C言語標準では、sizeof(char)は、1にならなければならい
いやだから
sizeof(char)=1=8bit
とは限らないと・・・
もういいか
はい、次の質問どーぞー
領域確保の実験をしているのですが、
#include <iostream.h>
int main()
{
char *p;
int a = 10;
p = (char *)calloc(a, sizeof(char));
cout << "p=" << p << endl;
free(p);
void *vp;
vp = calloc(a, sizeof(char));
cout << "vp=" << vp << endl;
free(vp);
return(0);
}
を実行すると、
p=
vp=009132D8
となり、pの方がうまくいきません。どうしてでしょうか。
737 :
デフォルトの名無しさん:2006/05/07(日) 20:50:58
age
>>705 マクローリン展開は無限級数だから何か条件が与えられているはず。
課題の一部を省略されると答えようが無いよ。
>>722 マクローリン展開はおまけで、sin()の高速化が主題だから
>>705は読み解くのに苦労すると思われ。
#include <stdio.h>
main()
{
char moji[10]={'a','b','c','d','e','f','g','h','i'};
int i;
printf("%s\n",moji);
for(i=0;i<=9;i++){
printf("[%d]の中身は%s\n",i,moji[i]);
}
}
for文のところで「問題が発生したため、test00.exe を終了します。 ご不便をおかけして申し訳ありません。」
と出ます、なぜでしょう?
winXP HOME BCCです
printf("%s", moji[9]);
>>736 すべて '\0' でクリアされた領域を指すポインタ p の
内容を表示させたらカラの文字列で正しい結果だ。
つか、iostream.h なんか include してやがる、とか
そもそもそれ C++ じゃん、とかも含めて
うまくいってないのは君の頭の働きが悪い所為。
>>739 書式に "%s" を指定しておきながら moji[i] を渡しているが
結局何がしたいんだ?
%sにはアドレスを渡さないといかん
>>739 %sを%cにすればいいと思うよ。でも僕初心者だからわかりません
>>739 moji[9] に何が入っていると思う?
ぬるぽ
>>740-743 ありがとう
そしたら
[0]の中身はabcdefghi
[1]の中身はbcdefghi
[2]の中身はcdefghi
[3]の中身はdefghi
[4]の中身はefghi
[5]の中身はfghi
[6]の中身はghi
[7]の中身はhi
[8]の中身はi
[9]の中身は
となります、配列一つ一つに格納されるのではないでしょうか?
? "%c"かその出力 >747
moji[9]がnulなのは幸運のしるし。
>>747 printfの変換指定子を%sから%cにしろと言ってるだろ
>>747 %s、は文字列を返す変換指定子
文字列とはこの場合、moji[i]から次の'\0'の現れる場所まで。
今回はたまたまmoji[9]が'\0'だったようだから、
例えば、i=0、の時にmoji[0]からmoji[9]までを表示する形になった。
もしも、moji[i]だけを表示したいのなら、
は文字を返す変換指定子、%c、を使わないといけない。
と皆様方はおっしゃっているのではないかと、素人ながら思うわけです。
>>752 素人ナカーマ( ´∀`)/\(´∀` )/
>>748,750
for(i=0;i<=9;i++){
printf("[%d]の中身は%c\n",i,&moji[i]);
}
にしました。すみません
[0]の中身は
[1]の中身は・
中略
[9]の中身は・
になります
>>749 それは気をつけました
>文字列を返す変換指定子
>文字を返す変換指定子
ここの表現に引っかかるものを感じるのであります
"返す"ってどゆ事?
"〜と解釈して変換汁"と指定って事でそ?
%c
&moji[i]
ってw
printf("[%d]の中身は%c\n",i,moji[i]);
じゃ無いの?レス読んで無いからよくわからんけど。
気にするな。
最初はみんなこんなもん。
>>756-758 出来ました!ありがとうございます。
moji[i]でアドレスが渡るんですか?(その様だけど)
>>761 ちょっと違う。
mojiにmoji[0]のアドレスが格納されている。
moji=moji[0]って漢字かな
>762
ちょっと違う
char moji[10]={'a','b','c','d','e','f','g','h','i'};
のときの moji[9] って C の規格としては未定じゃないの?
>765-766
知らんカッタ。サンクス。
配列の初期化では、初期化の足りない要素は 0 で初期化されます
だってさ
ちなみに昔の C 言語では構造体や配列をあらかじめ初期化するには、始めの要素からすべて指定して初期化する方法しかありませんでしたが
指示付きの初期化子は初期化時に配列の要素やメンバ名を指定することで、わかりやすく初期化を行えるようにする
例えば、配列の 3 番目の要素を初期化したい時には、 [3] = ..., というように記述します。また構造体や共用体を初期化したい時には、.メンバ名 = ..., のように指定することで初期化を行えます。
独習C読んでるんだけど250ページあたりで挫折しそう。(特に文字配列を使ったところがいまだ理解できてないっぽい自分が・・・)
なんかもっと入門用のお勧め本教えて
絵本
>>769 はじめてのCでも読んどけ
電車の中だとちょっとアレだがな
よく考えてみたらすれ違いだった
>>771初めてのCはなんとなく読んだ
とりあえず何度も読んで理解しようと思ふ
条件式を
((a==99 && b==88) || (c==55 && d==44))
にするか、
(a==99 && b==88 || c==55 && d==44)
にするかで、どういった違いが出るんですか?
プログラムの動作上は変わりないですよね? 変わるとしたらコンパイル速度ですか?
C言語の入門書としてこれまで見た本の中で最高。
この本を見ていると、「どうして『ポインタ』が『Cの壁』になんかなるんだろう?」と思ってしまうほど。
>>773 読みやすさ。
演算子の優先順位は、おぼえるの大変だから、カッコはつけたほうがいい。
(四則演算でもつけたほうがいいって書いてある本もあるくらい)
>>773 一番の違いは見た目。
前者のほうがわかりやすいと言う意見もそれなりにある。
>変わるとしたらコンパイル速度ですか?
ソース読んだ人の理解する速度
配列 char str[256]; があった場合なんですが、添字を指定しない場合は
先頭要素の最初のアドレス &str[0] と等価ですが、添字を指定せずに
アドレス演算子を使った &str はどういう扱いになりますか?
printf でアドレスを表示させてみたところ、同じところを指してましたが、
処理系依存でたまたまなのか、そういうものなのか、分かりませんでした。
そういうものです
型が違うんだけど
同じところを指す
>>780 わずか40秒のレス、ありがとうございます。そういうものなんですね。
ネットで調べても、配列の場合は & は必要ありません、ばかりで
&を付けた場合の説明を見つけられなかったので…。
>>773 コンパイラにもよるが意味による最適化は行わないかもしれないから
(a==99 && b==88 || c==55 && d==44) ではなくて評価回数が多いのであれば
(c==55 && d==44 || a==99 && b==88) 括弧とかは演算子の優先順位を保証するためだから
つけたかったら付ければいい
>>782 781も書いてるけどまったく同じってわけじゃないですよ
int main()
{
char array[10];
printf("array: %p\n"
"&array: %p\n"
"array + 1: %p\n"
"&array + 1: %p\n",
array, &array, array + 1, &array + 1);
}
>>782 配列へのポインタが必要な場合は、配列にアンパサンドをつける必要があります。
通常、そういう使い方の説明をする人はいないから配列にアンパサンドをつける必要がないという書き方になるのでしょう。
#要は、>781なので使い道がないわけではない。
>>781 書き込み前にリロードしてませんでした。すみません。型が違うんですね。
今まで、scanf で &str でもうまく動いてしまっていたので、偶然なのか、
疑問に思ってました。781を読みましてchar*型への代入で試してみましたら
間接参照のレベルが 'char *' と 'char (*__w64 )[256]'で異なっています。
の警告がでました。配列のポインタ(?)になるんですね。
>>785 試してみました。
指しているアドレスは一緒でも、型が違うのでポインタ演算の結果が異なるんですね。
>>786 配列へのポインタとのことで…疑問が解けてすっきりしました。
疑問を晴らすことが出来ました。勉強になりました。ありがとうございました。
>>768 >指示付きの初期化子は
C99以降、な。
>>775 >演算子の優先順位は、おぼえるの大変だから、カッコはつけたほうがいい。
程度問題。&& と || くらい覚えとけ、って気が個人的にはしなくもない。が、
>(四則演算でもつけたほうがいいって書いてある本もあるくらい)
どこの小学生向けの本だ。
ビット演算と論理演算は括弧つける事が多いね。
演算子の優先順位を覚えていても、
知らない(覚える気のない)人も多いから
括弧を付けた方がいい。
エスケープシーケンスでカーソルを全角用の2文字分の長い方に意図的に換える方法ってないでしょうか
ヘタレな漏れに GetCurrentDirectory について教えていただきたいんですけど…
------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
〜略〜
TCHAR szPath[MAX_PATH];
GetCurrentDirectory(ARRAYSIZE(szPath) , szPath);
printf("%s\n", szPath);
------------------------------------------------------------
すると、CとかDとかドライブレターしか帰って来ません。VS2005 expressのVC++で
コマンドラインアプリ作ってるんでっすが、これは仕様?それともなんかミスしてますか?
GetModuleFileNameでもドライブレターしか帰ってこない(´Д⊂)
「C:\TEST」が帰ってくるハズなんですが…
「C」しか帰ってこない
どうすればフルパス取得できるかを是非教えてください。
>>790 機種依存。スレ違い。
このスレ的には、何も教えられる事はない。
>>792 環境依存。スレ違い。
このスレ的には、wprintf 使え。
だったらどのスレ行けばいいの?
魚屋に入って「ニンジンください」って言って「八百屋行け」って言われて「どこにあるの?」と訊いてるようなもんだ。
自分で探せ。
ヒント:ユ○コー○
792です。
793さんありがとうございました。
Cなんて10年ぶりく位なんで状況の変換に戸惑いまくりです。
*szPathにデータが入ってるのは確認できるのに、なぜ出力できない…って
戸惑っていたんですが、wprintfなんてのがあったんですね
てっきり、printfがunicode拡張されてるもんだと思い込んでおりました。
本当に的確なアドバイスありがとうございました。
>>797 この場合は wprintf じゃなくて _tprintf を使え。
>>798 いい加減、スレ違いな質問に答えるのは、
辞めていただけないでしょうか?
質問する方も「何が問題で自分はどうすべきか?」と言う一般常識くらい、
身につけていただきたいものだ…。
そういうのが分からないからここで聞いてんだろ
だったら誘導したりなんなりすればいいだろ
全員がお前みたいにできるわけじゃないんだよ
何が一般常識だよ
「公共の場ではTPOをわきまえろ」は一般常識だな。
例えば
>>1を読むのは2chでは一般常識だろう。
それでの意味が分からないのなら、そもそもそのスレッドに投稿すべきではないな。
訊くべき場所がわからないなら、最初に汎用の質問スレに書くべきだ。
>>800 誘導してほしけりゃ誘導スレへ行けばいい。
自分の問題解決能力の欠如を他人のせいにするな。
なんというか排他的な奴が多いよなプログラマって。
なんでだろ不思議だ
だったらその質問誘導スレとやらを最初から教えてやればいいだろ
世の中にはお前らみたいなできるやつばかりじゃなくて
一般常識もなく低脳で問題解決能力のないやつもいるんだよ
792,797です。
798さんアドバイスありがとうございます。
_tprintfなんてのがあるんですね。
少し、調べたんですがいまいち良くわかりません。
_tprintf は tchar.h でマッピングされてるルーチンで
_MBCS とか _UNICODEが定義されている場合に printf か wprintf に
処理を振り分けるような感じで認識してよいのでしょうか?
実は、VS2005 Expressは変な構成なようで
_tsetlocaleがまともに動きません(´Д⊂)
_tprintfは使ってみることにしますが。
なんか_MBCSなプログラムは厳しいかも…
これでは、Windows98では動かんプログラムになっちゃうのかな?
792,797,806です。
スレ違いなんですね。悪かったです。もうきません(´Д⊂)
答えてくれた方々ありがとうございました。
>>804 排他的だとなんか問題あるんだろうか?
「あれこれ教えなくても済む人」だけを相手にしていた方が明らかに仕事の効率はいいんだけど。
>>805 >一般常識もなく低脳で問題解決能力のないやつもいるんだよ
そんな奴に優しくしてやる必要なんか無いわけで。
>>804 レストランに行って「預金をしたい」と言って、
断られるのと何ら変わらない。
「餅が欲しい」と言われて、
「餅の専門店、もしくは餅も売っているスーパーの様な所に行ってください。」
と言っているのと何ら変わらない。
# 検索機能くらい有効に使って欲しいものだ。
散々検索しましたが
じゃあその散々とやらを聞かせてもらおうか
このスレとかgoogleとか
>>812 スレは検索して板は検索しないのか…。
それで「散々検索した」なんて、よく言えたものだ…。
板っていうと例えば具体的に何って検索すればいいんだ
C言語のことだからそれらしきスレで検索したつもりだったが
スレッド一覧で646しかねぇーんだから、見ろよ。
あと「あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。」って表に書いてあんだろ?
リンク先が終了してるとか、とぼけたことぬかすなよな。
専ブラ使いなら当然のこと、
Web ブラウザで見てる奴でも
上部にあるスレのリスト右下に
「スレッド一覧はこちら」 というリンクがあるのは
見て判るだろう。
そうやって検索すると複数のそれらしいスレが
見つかるハズだし、それらのスレにどういう違いが
あるのかくらいは疑問に思わないのかと。
> スレッド一覧で646しかねぇーんだから、見ろよ。
俺は初心者だと思ってなかったし、C言語のことだろうと思ったからここでいいと思ったんだよ
結局俺は初心者だったんだろうし、これからは然るべきスレで聞いてくるよ
> あと「あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。」って表に書いてあんだろ?
専ブラだから気づかなかったんだよ
常識もなく出来の悪い子は何やっても駄目なんだから素直に諦めれww
最後にリロードせずに書き込んだということを付け加えておく
WW使いはヒク
>>817 >専ブラだから気づかなかったんだよ
それは無知無能、或いは怠慢だな。
・無知
専ブラにもローカルルールを見る機能はある。
・無能
どこで質問したら言いかと疑問に思った段階でローカルルールに何か書いてないかと疑問に思うべき。
・怠慢
もし疑問に思ったのであれば、それを怠ったのだから怠慢だ。
822 :
デフォルトの名無しさん:2006/05/08(月) 15:10:54
>>820 wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
いちいち書き込むのと読む機能以外はおまいらみたいに暇じゃないから面倒なんだよ
それにどこで質問したら言いかと疑問にも思わなかったし(ここでいいと思い込んでいた)
>>823 そういうのはこっちの知ったこっちゃ無いね
>>823 で?社会では自分に非があった場合、どうする?
・逆切れする
・逃亡する
・謝罪する
827 :
デフォルトの名無しさん:2006/05/08(月) 15:22:57
どうしてこうも分かり易い自作自演をするのでしょうか
私は頭が痛いですwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
すれ違いがNGなのは分かるが、
こういう下らないやり取りはNGじゃないのな
とうとう言い返す言葉がなくなったか
んじゃあそのすれ立てるまでもない何ちゃらとかいうところで聞いてくるからおまいら煽りに来るんじゃねえぞ
#define _XOPEN_SOURCE
#include <unistd.h>
char *crypt(const char *key, const char *salt);
この crypt 関数は、使ったあとに、ポインタに対して free しなくてもよいのでしょうか?
>>831 スレ違い。
非標準関数は該当環境スレへどうぞ。
833 :
デフォルトの名無しさん:2006/05/08(月) 17:57:22
>>831 標準Cに crypt() はなかったはずだが?
妥協案として次のスレから1にC/C++室を張るというのはどうか?
835 :
質問:2006/05/08(月) 19:22:22
学校の授業で「円周率をfor文と公式を使って求めよ」っていう問題があって、
double pi=0.0;
int i;
for(i=0;i<1000;i++)
pi=pi+1/(2*i+1);
みたいな感じにしたんです。けど、i<1000の判定がイマイチ使えません。
これ以上iを増やす必要がないという判断はどうすればいいのですか?
通常こういった判定はどのようなものを使いますか?
スレタイを「標準 C なら俺に聞け!」にして、
標準以外のスレのタイトルとリンクを貼る。
これでおk。
>>835 変化率が小さくなれば終了。
で、使う公式はそれ固定なの?
838 :
質問:2006/05/08(月) 19:38:11
>>837 あと2つほどあります。powはmath.hのアレです。
>>835はライプニッツの公式(
>>835はちょっと間違ってました。すみません)
pi=pi+pow(-1.0 , i)/(2*i+1);(ただしこのpiは実際の円周率の4分の1)
マチンの公式
pi=pi+4*pow(-1.0 , i)/(2*i+1)*(pow(1.0/5.0 , 2*i+1)-pow(1.0/239.0 , 2*i+1);(piは実際の円周率の4分の1)
円周率の無限級数
(円周率の2乗)/6=Σ(1/(nの2乗)) (n=1から正の無限まで)
>>838 pow は使わずとも実装できる。
これ考えるのも宿題の範疇だろうから自分で考えれ。
ライプニッツとマチンと二乗のとで比較すんのかな?
まあ、ガンガレ。
printfや、scanfのfはformatの頭文字だと考えていいでしょうか?
>841マテw
平林雅英の新ANSI C言語辞典だと print fortmat になってる
あの本は良いよ
技術評論者の回し斧みたいだけど
回し斧ってこえーな
838>>
おなじ学校カナー(゚д゚)
自分は普通にpowつかった
>>840 一般的には「format」の頭文字と言われているが、
真偽は名付けた人のみが知るところ。
だれか名付けた人にメールで聞いて
849 :
デフォルトの名無しさん:2006/05/09(火) 02:00:18
printf
print with format
書式付き出力
print formatted output じゃね?
イイモデード
852 :
デフォルトの名無しさん:2006/05/09(火) 02:22:41
ネットで検索すると
printf - format and print data
printf - print formatted output
printf - display a formatted string
こんなかな?
いずれにしてもprintfのfはformatでしょう
printTだったら日本だけ高橋名人になってたな
854 :
デフォルトの名無しさん:2006/05/09(火) 03:24:43
え?
print は日本語では印刷。
いまだに印刷という単語を使っているところがまた長寿な感じがするが、
よく考えたら Java もそうだった。
Java よ。オマエは一体どこに印刷しているというのか。
856 :
デフォルトの名無しさん:2006/05/09(火) 04:04:14
Cが誕生した頃のコンソールはテレタイプ端末だったからね
プリンターにキーボードがついたやつ
だからdisplayfでなくprintfなんだろうな
そして print に display の意味が加わった、と。
BASICに至ってはPRINTが画面出力でLPRINTが印刷だもんなぁ
スレ違いスマソ
859 :
デフォルトの名無しさん:2006/05/09(火) 06:18:31
>>858 TTY端末にPRINT、ラインプリンタにLPRINTだね。
861 :
デフォルトの名無しさん:2006/05/09(火) 06:47:38
壮大な活字ドラムに垂れ幕のようなインクリボン
ネクタイを巻き込まれたら(((( ;゜Д゜))) ガクガクブルブル
>>862 でも、そのUnixはCじゃない。アセンブラで書かれたモノだ
最初のUNIXがPDP-7なことには変わりない。
最初のUNIX&C っつーとるやろげ。
866 :
デフォルトの名無しさん:2006/05/09(火) 13:57:27
突然すいません
C言語でプログラムを組んでいるのですが、
どうもメモリリークを起こしているようです。
メモリリーク箇所を検出するにあたり何か良い方法
(チェック関数)等はありませんでしょうか?
ハード:SUN
OS:Solaris9
言語:C
です。
環境依存でない方法だと、mallocとfreeを別のマクロや関数に置き換えてログを取るという方法があるかな?
便利ツール等は環境依存スレ等適切な場所で訊いたほうがいいね。
>>867 自分で malloc() と free() を書けばいいじゃん。
あ〜、自分の書いたmallocも「別の関数」な。つーか「malloc」というのは「標準関数のmalloc」の意味。
マクロかましたほうが、__FILE__や__LINE__出せて便利じゃね?
871 :
デフォルトの名無しさん:2006/05/09(火) 14:17:24
>>867 mallocとfreeを別のマクロや関数に置き換えてログをとる方法ですか・・・
すいません、初心者の為よく分からないのですが、
具体的に教えていただけないでしょうか?m(__)m
>>868 プロセス及びグローバル管理をH社のミドルを使用して実現している
ためpurifyは使用できませんでした・・・
ちなみに、malloc及びfreeの回数は一致していたのですが・・・
もしかしてメモリリークではないんですかね・・・
個数じゃなくて回数なわけだけど、
よく分からないのにどうやって調べたんだ?
ログ取る malloc/free は、
コンパイラによっては既に用意されていることもある。
ただ、この話は該当コンパイラのスレで聞いた方がいい。
本当にメモリリーク起きてるの?
そう思った根拠は?
>>871 まぁ、回数が一致しててもfreeしてはいけない箇所をfreeしている可能性はある
リークよりも確保してないポインタをfreeする方が問題だな
875 :
デフォルトの名無しさん:2006/05/09(火) 14:28:15
>>872 チェックツールがあったので、そのツールを使用してチェック
して見ました。
コンパイラのスレですかありがとございます。
>>873 再現率は
2台系のサーバーでここ一週間で2回coreを吐いてプロセスが死にました。
そして、coreをdbxコマンドを使用して解析した結果、提供されているH社
の通信ミドルで使用しているfprintfで落ちているらしく。
2台系とも同じ箇所で死んでます・・・
上記理由からどこかでメモリリークを起こしているのでは?と思ったのですが・・・
環境依存の話だが、glibc を使っているなら今すぐ
malloc() のマニュアルページを読め。
MALLOC_CHECK_ の文字列を探せ。
「メモリリーク」の用語を勘違いしてる気がするな。
メモリリークは不要なのに開放されないメモリ領域が発生することであって、
書いちゃいけないメモリに書き込むことじゃない。
ここで起きてるのは、書いちゃいけないメモリに書き込んでる方な希ガス。
動的配列の境界チェックした方がいいと思う。
fprintf で落ちる ⇒ どこかでメモリリークしてる への思考の過程が理解できないな・・・
落ちているソバあたりから追跡するんでねーの?(外部ミドル提供関数の仕様も含めて)
# その結果として、メモリ不足発覚→なんでメモリ不足になるよ?→リークしてるじゃん ならわかるが
free 後に書き込んでる可能性もあるな。
例えば:
#define MALLOC(n) log(__FILE__, __LINE__, "malloc"), malloc(n)
#define FREE(p) log(__FILE__, __LINE__, "free"), free(p)
int log(char *f, int l, char *m);
ポインタの値もチェックするなら
#define MALLOC(n) my_malloc(__FILE__, __LINE__, n)
#define FREE(p) may_free(__FILE__, __LINE__, p)
int log(char *f, int l, char *m, void *p);
void *my_malloc(char *f, int l, size_t s){
void *p = malloc(s);
log(f, l, "malloc", p);
return p;
}
void my_free(char *f, int l, void* p){
log(f, l, "free", p);
free(p):
}
881 :
デフォルトの名無しさん:2006/05/09(火) 14:36:14
>>877 変数のサイズチェックということでしょうか?
会社入って1ヶ月なのに・・・わけわからないし・・・
なんかもう仕事やめたくなってきました(涙)
coreがあってdbxもあって原因不明かよ
スタックトレースみたことあるのか?
>>881 char* p = malloc(32);
p[32] = 0;
みたいな事やってんじゃないのって事。
新人にまかせる仕事じゃねなぁ、とか。
仕事中に2chに質問かよ、とか。
2chにフリーアクセスできるPC系の職場ってどんなだよ、とか。
突っ込みどころは満載なわけだが。
>>881 上司はお前が理解できていると判断して渡した仕事かもしれん。
このまま、ココで質問しつづけても、不幸になるだけだ(スレ住人 & 上司 & お前)
ここに書いたようなことを、そのまま上司に相談汁。
887 :
デフォルトの名無しさん:2006/05/09(火) 14:43:41
みなさんありがとうございました
上司に相談してみます・・・
それにしても情けないですね
本当にありがとうございました
がんがれ
>>874 環境固有では色々面倒みてくれそうだけど、標準だと char a; free(&a); の動作は未定義?
C言語に限らず、ヤバイと思ったら上司に相談しろ
だが、相談する前に何がどうおかしいのかを整理してからな
# fprintfでcoreなんてほぼあり得ないから
# 上位関数でfprintfに変な引数を渡してるんだろうな...変な引数渡しやすい関数だし
>>890 二重 free() とか、free() してはいけないポインタを free() に
渡した後の fopen() とか malloc() とかで落ちるという現象は
体験したことある。昔の Sun 純正の C コンパイラのライブラリ
はそんな動作だった。この頃は Linux で gcc + glibc なので
MALLOC_CHECK_ が使えて楽だ。
893 :
デフォルトの名無しさん:2006/05/09(火) 17:33:26
C言語ってMEでも使えるんですか
あと無料でできますか
それくらいは自分で調べろ
>>893 Meで使える無料のコンパイラもあるけどもVisual C++などのコンパイラを使いたければ2000かXPにするべき
896 :
デフォルトの名無しさん:2006/05/09(火) 17:44:19
Microsoft Visual C++1.51 ってのが必要らしいんですけどどこにあるんですかね?
>>895 とりあえずVisual C++は使わないので・・・
899 :
デフォルトの名無しさん:2006/05/09(火) 17:48:40
ありがとうございました
感謝します
>>899 つーかそれ以前に>898はVC1.51ではない、それ用のツールだ。
まあ学習用なら Cygwin でも使えば?
初心者がCygwin使うと日本語の処理でerrorがでて躓く。
関西では ARIA とガー君とひぐらしがかぶる。
全部見てるけど。
誤爆すまんす
GCCならOUTPUT_CHARSETいじるだけでちゃんとなるからすぐできるでしょ。
某サイトのネタだが
#include <stdio.h>
main()
{
double x,y;
int n1, n2;
x=10.0;
y=204.7*x;
n1=y;
n2=204.7*x;
printf("%d %d\n", n1, n2);
return 0;
}
の出力結果が2047 2046と出力される
Borland C++ 5.5.1 for Win32とgcc version 3.4.4の最適化なしの場合
# 最適化するとコンパイラが計算してしまうので却下
n2が正しい結果を返さないのにn1はyに一回代入しただけなのに正しい結果を返すのは何故だ?
8087自体のレジスタは80bitだから。
いったん64bit doubleへの変換してからintへ変換するのと
80bitから直接intへ変換するのの違いだとおもう。
winでコンパイルするときどうしてますか?(BCC)
BATのファイル名を書き換えるのがめんどうになってきました
コマンドプロンプトは飾りか?
Makeなんて飾りですよ
>>909 スレ違いだが、BccDevでググルと幸せになるかもしれないな
俺はmakeファイルの方が好きだがな
batファイルはcygwinを入れたら使う気がなくなる
913 :
909:2006/05/10(水) 21:17:49
makeってそういうことできましたっけ。ヘルプみたけどできないような・・
BccDevとcygwinを入れられない環境でs。
BATのコマンドを駆使してできないかな。できそーな気がしないけど
具体的に言うと、どういう風にしたいの?
つーか、おまいらスレ違いだ。
Borland C++ Compiler 5.5をインストールしたんですがコンパイルしようとすると
エラー E2209 c:\my documents\プロジェクト\tist\tist.c 3: インクルードファイル 'stduo.h' をオープンできない
となってしまいます
bcc32.cfgとilink32.cfgはC:\borland\bcc55\binに入れてあって間違いはないと思います
-I"c:\borland\Bcc55\include"
-L"c:\borland\Bcc55\lib"
もbcc32.cfgに書いたのですが・・
失礼しました
>>909 コマンドライン引数でいいんジャマイカ?
921 :
デフォルトの名無しさん:2006/05/10(水) 23:53:52
これからCを始めようと思うんですがこの「エディダ」ってのいうのは買わなければ
いかんのでしょうか?それとも無料でダウンロードできるところがあるんですか?あるなら教えてください
無理してスレを盛り上げなくていいですよ
盛り上がってないよ
ここって超初歩的な質問してもいいですか?
realloc()について質問があります。realloc()関数は、
『指定したヒープメモリのブロックを、指定したサイズに変更して再度割当て、
古いメモリブロックにあったデータは可能な限り新しいメモリブロックにコピーされる』
という挙動をするようですが、この『可能な限り』とはどんな状態を指すのでしょう?
例えば、物理メモリを1024MBを積んだマシン上で、
malloc()によって768MB領域確保したポインタに、realloc()によって再度800MBの領域確保をしたとすると、
どのような挙動をするのでしょうか?
上記の例だと、768MB+800MB > 物理メモリ(1024MB) となってしまって、
一時的に物理メモリの容量を超えてしまうのではないかと思うのですが、どうでしょうか?
この場合でも古いメモリブロックにあったデータは新たなメモリブロックにコピーされるのでしょうか?
もし古いメモリブロックが新たなメモリブロックにコピーされるとしたら、
その場合は物理メモリで足りない分のメモリ分だけHDDにスワップが発生するのでしょうか?
メモリ節約のため、realloc()を小まめに呼び出すようなプログラムを書こうかと思っているのですが、
上記の例のようなことが起きるのではないかと危惧しています。
このようなプログラムを書くのはよくないのでしょうか?
>>927 C言語の仕様では、あなたが考えているような都合のいいそんな概念は無い。
邪魔なデータが無ければそのまま 768MB の領域が
800MB にそのまま延長されるだけかもしれないが、
そういう事は期待しない方がいい。
普通はスワップガリガリしつつ新しいメモリ領域から確保するか、
メモリの確保に失敗するかだろう。
こういうメモリの確保の仕方は、普通しない。
必ず連続領域として扱わないといけないなら最大値で一気に確保。
連続領域でなくていいなら、
完全にリストにすると色々無駄だから、
ある程度の長さの配列を要素に持つ連結リストを作る。
>>927 >928、>929はあーだこーだと言っているが要は環境依存だ。
自分でそのような実験プログラムを作って試してみるといい。
案外最低限のディスクアクセスで済むかも知らん。
#少なくとも>929が書くようなメモリ確保に失敗するほど蛸なOSは少ないだろう。
Cygwin の GCC でメモリ確保をしてると、
思ったより少ない所でメモリ確保に失敗するね。
MinGW だと問題ない状況でも、失敗する事がある。
>>931 ふつーのUNIX系OSはulimitとかlimit とかでリソースの限界を変えられる
ようになっている。Cygwinだとどうだか分からないけどこれにも互換性が
ある場合はメモリの限界とかは変更可能かも知れないぞ。
>>931 の状況では、
MinGW でコンパイルしたものを Cygwin で動かして大丈夫で、
Cygwin GCC でコンパイルしたものを Cygwin で動かして失敗した
2GB 弱メモリを確保したんで、
Cygwin 用にする事による若干のメモリ増が
悪さしたのだと思ってる。
残念ながら limit は関係ないと思う。
>>928 >メモリ節約のため、realloc()を小まめに呼び出すようなプログラムを書こうかと思っているのですが、
「小さな親切、大きなお世話」の典型例
>>927 > この『可能な限り』とはどんな状態を指すのでしょう?
サイズ小さくしたら、あふれた分はコピーされないよ
ってことじゃないの?
いずれにせよ、物理メモリとかページングとかは意識しない。
Cでやってるなら自分でreallocに相当する動作を書いてみりゃいい。
そうすりゃ↓この辺の気持ちもなんとなく分かるよ。
> この『可能な限り』とはどんな状態を指すのでしょう?
>>928-936 レスありがとうございます。
データ長が可変で、メモリ量を大きめに設定して静的に確保すると、
それこそ1GBぐらい余裕で消費してしまうので、
できれば動的に必要な分だけ確保したかったのですが、
考えが甘かったようです。
リストにすることを考えつつ、何か良い方法がないか頑張ってみます。
皆さんどうもありがとうございました。
>>937 環境書いてないから判らんが(尤も書いてあったらスレ違いだが)、
malloc()で1GB確保してもその時点ではスワップは発生しないと思うのだが。
必要量が比較的初期の段階で確定するなら、大量に確保→realloc()で不要部を解放、でもいいだろう。
939 :
超初心中の初心者:2006/05/11(木) 14:44:38
C言語勉強し始めて3ヶ月ぐらいの初心者ですが、「構造体」「共同体」についての説明
はいくら読んでもモヤットしていますけど、分かりやすいような説明が載ってある参考書
とかありましたら、教えてもらえませんか?
よろしくお願いします。
>>921 Windows ならとりあえずメモ帳でも使っておけば?
その他、フリーで沢山あるので探せばいい。
>>939 3ヶ月いくら読んでもモヤットする奴が読んでも、分かりやすく書いてある参考書ですか?
なかなか条件が厳しいな・・・
とりあえず、なにが分からんのよ?
僕はCを10年は使っていますが、「エディダ」を使ったことがありません
「エディダ」なんてなくても開発は出来ます。
あ、ちなみにエディタはvi(m)だけどな。
943 :
超初心中の初心者:2006/05/11(木) 14:54:22
944 :
超初心中の初心者:2006/05/11(木) 14:56:29
>>942さん
viってUNIXでWinのメモ帳みたいなエディタですよね?
Unixではviは標準のエディタだが、機能はメモ帳よりはるかに優れているので
メモ帳ごときと一緒されては困るな。
946 :
超初心中の初心者:2006/05/11(木) 15:10:31
みたいなものって言ってましたけど、同じとかは言ってません;;;
私もviの方がいいと思っていますので(^^;;)
読んで分かろうとするな。書け。
すまん、Cを使って20年になる漏れに、「共同体」というやつが何物か教えては貰えまいか。
一心同体少女隊の親戚でしょう、多分。
950 :
超初心中の初心者:2006/05/11(木) 15:58:37
参考書の演習問題もPCでやってましたが、その一つ一つの意味が完全に理解できなくて、
説明文読んでも、やはり理解できなかった・・・申し訳ないほどバカです・・・;;;
952 :
超初心中の初心者:2006/05/11(木) 16:04:32
>>948 「共同体」:全体で1つしか値を記憶することができない、同時に別の値を記憶することが出来ない。
つまり、共同体のメンバは、一度に1つだけしか値を記憶できない。
っと、参考書はこう書いた・・・
それは共用体。
それに、配列や構造体を含んでれば、
複数の値を記憶できる。
理解するんじゃない。感じるんだ。
955 :
超初心中の初心者:2006/05/11(木) 16:08:15
感じるって・・・?
良いコードをたくさん読んで、自分でもコードを書いて経験を積めってこと。
>>944 いや。UNIXでメモ帳みたいなエディタは emacs の方だ。
但し機能は雲泥の差。
959 :
超初心中の初心者:2006/05/11(木) 16:21:25
ただ読んでいて、理解出来なかったら、意味ないのでは?
ある程度の理解はやはり必要でしょ?^^;;
ただ読むのはバカのやることだ。
そんな理屈を捏ねている暇に書け。そして間違えろ。
そうするうちにどうすれば使えるか感じられるようになる。
そうして更に書けば、自ずと理解できているもんだ。
>>957 emacsは別途インストールしないとダメじゃないか
/binに入っていない事も致命的に非標準
理解するまでは弄くり倒す、分かってきたら他人のソースを見て勉強。
964 :
超初心中の初心者:2006/05/11(木) 16:43:08
なるほど・・・
どうすれば二つ以上のcやcppを使えるのか・・
#include "xxxxx.cpp"とかは書いてないし
分割コンパイルでググれ
>>965 > #include "xxxxx.cpp"
これでも出来るよ。激しくお勧めできないけど
多分、コンパイルとリンク違いがわかってないんだろうな
「リンク違い」ってなんだ?
「の」が抜けたんだろうよ。
>>965 CやC++はけっこうファイル構造に依存していたりする。staticやexternなんかはそのためのキーワード。
最も依存してるのはJavaで1ファイル1クラスが推奨されている。
>>962 それはOSやディストリビューションやインストール時の指定によって変わる。
>最も依存してるのはJavaで1ファイル1クラスが推奨されている。
Java 使った事あんの?
public クラスの事なら1ファイル1クラスは推奨じゃなく強制。
非 public クラスを作ることは問題ないが、
それを作るかどうかは隠す必要があるかどうかで決めることで、
推奨だの非推奨だのそういう問題じゃない。
>>970 惜しい。Java は 1 ファイル 1 public クラス、だ。
public でないクラスは同じファイルにいくつあってもいい。
WNDCLASSEX構造体ってMSDNに載っていない??
スレ違い
とくに何もしないことを指して
#define NOP 0
〜〜〜
NOP;
の様に書いたら、わずかでもCPUの負担になりますか?
(コンパイル時でなく、実行時)
>>980 0; は何の動作もしないので、
おそらく最適化しようがしまいが削られて
全く負担にならない。
全く意味のない処理を入れてみても、
最適化してると削られる事がある。
何か計算して、最終結果をどっかで使わないと。
プログラムの最後に出力するだけでもいい。
volatile修飾した変数に適当に突っ込むと消えないと思う
0;が実行時にどのように処理されるというのか
984 :
デフォルトの名無しさん:2006/05/11(木) 22:14:33
>>980 ならない
あなたは何も「要求」を書いていないのだから
申し訳ないですが真偽を教えてもらいたくコピペしました
あるソフトウェアのソースコードにこんな関数があるんです。C(C++?)です。
char *trimstr(char *s1)
{
while (*s1)
{
if ((*s1 == ' ') || (*s1 == '\t'))
s1++;
else
break;
}
char *s = s1;
s1 = s1+strlen(s1);
while (*--s1)
if ((*s1 != ' ') && (*s1 != '\t'))
break;
s1[1] = 0;
return s;
}
このソフト、Linuxで動かすと、頻繁にセグメンテーションフォルトで落ちてしまいます。
デバッガで原因を調べてみたら、この関数に長さ0の文字列を渡すと起こる*ことがある*ようです。
私はC初心者なんで確認したいんですけど、この関数に長さ0の文字列を渡すと メモリが破壊されますよね?
メモリ破壊と言うか何というか(^^;
これ書いた奴死ねって感じ?
ソースに間違いまたは通常やってはいけないことがあれば指摘してもらえるとありがたいです
>while (*--s1)
> if ((*s1 != ' ') && (*s1 != '\t'))
> break;
' ' や '\t' が見つからなければ
文字列の先頭を超えて逆走。
というか、*s1 で何を判定しようとしてるんだ?
s と s1 との比較だろう、ここは。
教えていただきどうもありがとうございます
991 :
デフォルトの名無しさん:2006/05/12(金) 03:01:31
質問させていただきます
null文字というのはスペースということなのでしょうか?
例えばHTMLファイルの中にnull文字が含まれる可能性はありますでしょうか?
null文字に付いて詳しく教えていただけたらありがたいです
0x0000のことだが
文字コードが 0 の文字のこと。
文字コードが0の文字が何を意味するのか聞きたいんだろ
C だと文字列の終端を表すのに使われる。
特殊な状況だともうちょい利用されるが。
> null文字というのはスペースということなのでしょうか?
いいえ。
> 例えばHTMLファイルの中にnull文字が含まれる可能性はありますでしょうか?
はい。
997 :
デフォルトの名無しさん:2006/05/12(金) 03:58:51
>>996 > > 例えばHTMLファイルの中にnull文字が含まれる可能性はありますでしょうか?
>
> はい。
ホント?
うっかり間違えて、通常のテキストファイルにぬるっと入り込んでることもあるよな?
別に HTML に null 文字入れることは可能。
これ使って null バイト攻撃っていうのが可能なことが。
/  ̄ ̄ ̄ ̄ ̄ ヽ
/ //ノノノ人ヽ ヽ
| / \ヽ |
|| '''''' '''''' :::::::ヽ /
.|(●), 、(●) .::|-、
| ,,ノ(、_, )ヽ、,, .:::::|り| ぬるぬるしている感じだった
.| トェ盆ェイ ..::::::|- '
\. `ニニ´ .::::/
,ィ介ー‐--‐一イ|\
/| | | |ヽヽ/,イ| | | | |ヽ
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。