C言語なら俺に聞け! Part 126

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 125
http://pc8.2ch.net/test/read.cgi/tech/1143900407/
2デフォルトの名無しさん:2006/04/23(日) 22:36:15
2
3デフォルトの名無しさん:2006/04/23(日) 23:09:30
今さらですが。

人生の先輩の皆さんはどのエディタ使ってますか?

弟にOSをリカバリされたのでちょうどいい機会なので他のエディタを使ってみたいです。
4デフォルトの名無しさん:2006/04/23(日) 23:15:08
秀丸使ってるってやつの意見は無視していいから。
5デフォルトの名無しさん:2006/04/23(日) 23:27:14
メモ帳に決まってるだろ!
6デフォルトの名無しさん:2006/04/23(日) 23:28:05
どんなコンパイラだろうとVS使ってる
7デフォルトの名無しさん:2006/04/23(日) 23:37:59
Meadow/emacs使っとけ
8デフォルトの名無しさん:2006/04/24(月) 00:39:05
TeraPad
9デフォルトの名無しさん:2006/04/24(月) 01:29:54
VZ Editor
10デフォルトの名無しさん:2006/04/24(月) 07:25:22
vi/vim使っとけ
11デフォルトの名無しさん:2006/04/24(月) 13:36:57
一通り出たかな。後は、この辺挙げておこうか。
xyzzy
桜エディタ
Peggy
12デフォルトの名無しさん:2006/04/24(月) 15:58:19
GNOMEのエディタがまだ出てないな
13デフォルトの名無しさん:2006/04/24(月) 18:15:38
>>6
俺もだ。SQL もバッチも、テキストというテキストはすべて。
ターゲットが Windows 以外のときも、makefile 手で書いて
カスタムビルドで nmake 走らせる。そこまでするほど VS。
で、たまに「ああもう!」と叫びながら vim 起動。
14デフォルトの名無しさん:2006/04/24(月) 18:37:34
>>13
nmakeってそんなにいいのか?
15デフォルトの名無しさん:2006/04/24(月) 19:35:38
>>3
vim

いつも Linux ばかり使っているもので、つい。
16デフォルトの名無しさん:2006/04/24(月) 20:01:11
VSのエディタが最強。
ここはVSを買えない貧乏人が集うスレ
17デフォルトの名無しさん:2006/04/24(月) 20:08:27
^^;
18デフォルトの名無しさん:2006/04/24(月) 20:21:34
Eclips
19デフォルトの名無しさん:2006/04/24(月) 20:31:57
xyzzy一筋
20デフォルトの名無しさん:2006/04/24(月) 21:22:11
もうこれからやるやつみんなVC++2005Expressでええやん
のんびり基礎やってるうちに次期バージョン移れるぞ
21デフォルトの名無しさん:2006/04/24(月) 22:11:11
夕べ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);
}
22デフォルトの名無しさん:2006/04/24(月) 22:13:14
>>21
sizeof(foo[1])をsizeof fooに、foooとfooooも同じように。
23デフォルトの名無しさん:2006/04/24(月) 22:14:06
2バイト確保するならchar foo[2];じゃねーの?
2421:2006/04/24(月) 22:15:43
日本語が変でしたヾ(゚д゚;) スッ、スマソ
fooに2byteの1020h
foooに3byteの304050h
fooooには4byteの5060708090h
を代入する方法を教えてください。
2521: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
とするには、どうしたらいいのでしょうか?
26デフォルトの名無しさん:2006/04/24(月) 22:50:22
>>25
printf("foooは:%x%xです\n", fooo[0], fooo[1]);
27デフォルトの名無しさん:2006/04/24(月) 23:20:36
VBプログラマ Cプログラマのお仕事
http://www.vb-c.net/
2821: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と同じ結果になってしまう気がしますし・・・
バイナリデータをどのように扱っていいか思案しています、
皆様のお知恵拝借お願いします
29デフォルトの名無しさん:2006/04/25(火) 01:26:48
ifとかswitchとか。
30デフォルトの名無しさん:2006/04/25(火) 01:56:03
* char func_hoge(.const char * hoge_x)とかいうね関数を作りたいんだけど
中でmallocした変数って返していいんだっけ?
char *a = (char *)malloc(sizeof(char) * 255);
return a;
こいつを返していいんだっけ?関数ないで作成した自動変数ってそのスコープだけじゃなかったっけ?
どうなんだっけ?
31デフォルトの名無しさん:2006/04/25(火) 02:06:26
a自体は捨てられるけどaが指すヤツ(mallocで確保したヤツ)自体は消えない
32デフォルトの名無しさん:2006/04/25(火) 02:10:20
>28
>foo[0]が00でfoo[1]が01の場合はhoge
>foo[0]が01foo[1]が00の場合はhoghoge

foo[0]*256+foo[1]
33デフォルトの名無しさん:2006/04/25(火) 02:12:21
ああそうかじゃあ、

char *b = hoge(....);
ってやったらfree(b)すればいいんだね。ありがとう
34デフォルトの名無しさん:2006/04/25(火) 08:59:30
>>28
君、プログラム辞めた方がいいよ。
35デフォルトの名無しさん:2006/04/25(火) 13:18:49
char buff[5] = "aiueo";
これってバッファオーバーフローしていますか?
36デフォルトの名無しさん:2006/04/25(火) 13:23:08
>>35
マジレスで使い方次第
37デフォルトの名無しさん:2006/04/25(火) 13:23:16
してるよ
38デフォルトの名無しさん:2006/04/25(火) 13:30:20
>>36-37
(((;゚Д゚)))
有難うございました。
39デフォルトの名無しさん:2006/04/25(火) 13:41:14
char buff[] = "aiueo";
なんでコンパイラに文字配列の大きさを計算させないのかを問いつめたい
40デフォルトの名無しさん:2006/04/25(火) 13:45:51
いや、危険な手法をレポートにしたいなと思ったんです。
41デフォルトの名無しさん:2006/04/25(火) 15:43:01
>>35
char buff[5] = "aiueo";は
char buff[5] = { 'a', 'i', 'u', 'e', 'o' };と同義

char buff[] = "aiueo";は
char buff[] = { 'a', 'i', 'u', 'e', 'o', '\0' };と同義
42デフォルトの名無しさん:2006/04/25(火) 16:22:29
>>41
間違ってねーか?
43デフォルトの名無しさん:2006/04/25(火) 18:42:59
typedef struct{
:
:
:
:
}HOGE,*PHOGE;

って

typedef struct{
:
:
:
:
}HOGE;

typedef HOGE * PHOGE;

と同じ意味ですよね?
44デフォルトの名無しさん:2006/04/25(火) 19:02:10
同じ意味
45デフォルトの名無しさん:2006/04/25(火) 19:10:39
>>44
ありがとうございました。
46 ◆RozenVuXpg :2006/04/25(火) 19:38:36
文字列を返す関数を作ったのですが、リターンで文字列を返した場合
メインの方で、文字列を受け取るにはどうしたらよいのでしょうか?
どなたか、よろしくお願いします。
47デフォルトの名無しさん:2006/04/25(火) 19:49:26
>>46
return で返せるのは、
 ・呼び出し元のスコープに所属するchar配列のどこかを指すポインタ
 ・mallocで確保した領域へのポインタ
 ・static領域(グローバル変数を含む)に確保されている配列のどこかを指すポインタ
のいずれか。
受け側は単純に char *p = f(); でいい。
文字列を保持したいなら、別途配列やmallocした領域にstrcpyする。
48デフォルトの名無しさん:2006/04/25(火) 19:56:08
文字列を返すCの戦略について
・呼び出し側確保型
strcpy(), strftime()など。strcpy()は確保された量を呼び出し側で保証する必要がある。
strftime()は確保された量も関数に渡すことで関数側でも制限ができる。
・静的領域型
ctime()など。このタイプは呼び出しごとに内部静的領域が破壊されるため、呼び出し側で
速やかに引き取る必要がある。また、この点からマルチスレッドに向かない。
・動的確保型
strdup()(非標準)など。このタイプは呼び出し側で解放することが必要になる。
しばしばそれは忘れられてメモリリークの原因になる。
49デフォルトの名無しさん:2006/04/25(火) 20:23:58
構造体の中に char 配列を入れて、それを return で返すという荒技もある。
50デフォルトの名無しさん:2006/04/25(火) 20:24:58
>>43
てか、C言語の場合は struct を省略出来ないと思ったが、あ、もしやC99で変わった?
51デフォルトの名無しさん:2006/04/25(火) 20:34:09
俺もそれ思った
52デフォルトの名無しさん:2006/04/25(火) 20:48:27
分単位の時間(min)を読み込み、それを時(h)、分(m)に変換して表示してください。
例:分→時、 分 変換
  分?75
  1時間15分

この問題のソースをおしえてください。
53デフォルトの名無しさん:2006/04/25(火) 20:53:04
>>52
ヒント: 60 で割った値と 60 で割った余りの値を使う。

まあ、あとは宿題スレで聞け。
54デフォルトの名無しさん:2006/04/25(火) 21:19:59
>>50
何の為の typedef かと小一時間・・・
55デフォルトの名無しさん:2006/04/25(火) 21:24:02
#include <stdio.h>
main()
{
int c,a,b;
printf("文字を入れて下さい");
c=getchar();

}

これを改良して、アルファベットの大文字を入れると小文字に、小文字をいれると大文字に変換するプログラムにしてください!
56デフォルトの名無しさん:2006/04/25(火) 21:25:33
宿題スレって無くなったのか?
57デフォルトの名無しさん:2006/04/25(火) 21:33:04
>>55
swich(c){case a:puts('A');
以下zまで
}
58デフォルトの名無しさん:2006/04/25(火) 21:35:55
>>57
ASCIIコードをなんかかえるみたいなんですが、0x20みたいにです
59デフォルトの名無しさん:2006/04/25(火) 21:42:51
>>58
いいからどっか逝け。
60デフォルトの名無しさん:2006/04/25(火) 21:50:27
>>55
if(c=='a'){c='A';}
else if(c=='b'){c='B';}
...
else if(c=='A'){c='a';}
...
else if(c=='Z'){c='z';}
61デフォルトの名無しさん:2006/04/25(火) 21:56:53
うん、最初は苦労したほうがいいな
62デフォルトの名無しさん:2006/04/25(火) 22:01:50
宿題スレでききます
63デフォルトの名無しさん:2006/04/25(火) 22:18:44
バイナリデータをファイルから読み込み、16進で表示させようとします。
1バイトずつ変数に受けて printf しようとする場合、
受ける変数は、char がいいのかな、それとも unsigned charがいいのかな。
それともどちらでもいいのかな。
64デフォルトの名無しさん:2006/04/25(火) 22:39:48
>>63
int
65デフォルトの名無しさん:2006/04/25(火) 22:40:26
unsignedじゃないとprintfのとき(キャストしないと)0x80以上だと符号拡張されちゃったような気がする
よくおぼえてないんでためしにやってみれ
66デフォルトの名無しさん:2006/04/25(火) 22:47:35
うろおぼえなら言わないほうがマシだぞ
67デフォルトの名無しさん:2006/04/25(火) 23:57:27
2重かっことかの計算をプログラミングで書くときかっこで代用できますか?
68デフォルトの名無しさん:2006/04/26(水) 00:09:05
2重でも3重でも小かっこでいけるが、何故試さない?
69デフォルトの名無しさん:2006/04/26(水) 00:10:10
>>67
ん? ((1 + a) * 3 + 5) / 2 のようなやつ?
それならいくらでも好きなだけお使いください。
70デフォルトの名無しさん:2006/04/26(水) 00:10:28
>>69
ども
71デフォルトの名無しさん:2006/04/26(水) 00:12:14
>>63
char で受けて2桁の16進数として出力する場合は & 0xff しないとマイナスの時に
やたら桁の大きな値が出て楽しいことになる。
72デフォルトの名無しさん:2006/04/26(水) 00:19:32
c ^= !!isalpha(c) << 5;
73デフォルトの名無しさん:2006/04/26(水) 00:45:26
>>71
unsigned char でキャストすればいいだけだろ。
74デフォルトの名無しさん:2006/04/26(水) 14:22:07
qwせdrftgyふじこlp
75デフォルトの名無しさん:2006/04/26(水) 14:34:58
while(a) {
while(b) {
continue;
}
}

これだとcontinueではwhile(a)に戻りますが
while(b)に戻す方法はないのでしょうか
76デフォルトの名無しさん:2006/04/26(水) 14:48:11
それって、while(a)に戻るの?
77デフォルトの名無しさん:2006/04/26(水) 14:48:19
while(a)に戻らないけど?
7875:2006/04/26(水) 15:07:29
すんません。とんでもない勘違いしてたみたいです
自分のソースではwhile(b)の部分にdoステートメントを使ってたのが勘違いの原因だったみたいです
79デフォルトの名無しさん:2006/04/26(水) 15:09:20
while(a) {
 do {
 while(b);
 continue;
}

こうか。
8075:2006/04/26(水) 15:13:24
厳密には
while(a) {
 do {
 continue;
 } while(0); //while(b)
}
これでdoに復帰するのだと思い込んでたらしいです
俺馬鹿('∀`)アハハ・・・ハァ
81デフォルトの名無しさん:2006/04/26(水) 15:21:35
>>80
それでdoに戻る訳だが…?
82デフォルトの名無しさん:2006/04/26(水) 15:22:03
>>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;
}

の方がすっきりする。
83デフォルトの名無しさん:2006/04/26(水) 15:23:17
最大値を拾う為の関数ってないですか?
84デフォルトの名無しさん:2006/04/26(水) 15:24:26
ないから作る。
85デフォルトの名無しさん:2006/04/26(水) 15:26:37
やっぱりfor文とかでまわして数値を拾うのか・・・
max();とかあればいいのに・・・
86デフォルトの名無しさん:2006/04/26(水) 15:27:26
maxを使いたいならC++でもやればいい。
87デフォルトの名無しさん:2006/04/26(水) 15:29:13
今やってる開発言語ANSI Cなのよ・・・
88デフォルトの名無しさん:2006/04/26(水) 15:29:53
型毎に比較関数が必要になるからね。
C だと qsort みたいなややっこい実装にならざるを得ない。
89デフォルトの名無しさん:2006/04/26(水) 15:32:36
>>85
自作の何が不満だ?
90デフォルトの名無しさん:2006/04/26(水) 15:35:13
>>89
とくにない。たまに時間ないとき面倒に思うときがある。そんだけ
91デフォルトの名無しさん:2006/04/26(水) 15:35:35
車輪の再発明になったらアレだろ?
92デフォルトの名無しさん:2006/04/26(水) 15:47:16
>>91
まぁね・・・
93デフォルトの名無しさん:2006/04/26(水) 17:34:42
>>88
そうだ!C にも template を導入してくれればいいんだ!
94デフォルトの名無しさん:2006/04/26(水) 17:43:11
#define MAX(a, b) ((a) > (b) ? (a) : (b))
これで我慢しろ
95デフォルトの名無しさん:2006/04/26(水) 18:26:30
>>93
それ C ちゃう
C++ や!
96デフォルトの名無しさん:2006/04/26(水) 21:28:16
ファイル内の文字列を変換するプログラムを作りたいのですが、
どうしたらいいのかわかりません。
わからないことを例にして書きます。

CDをDVD-RAMに変換 ()は文字数です
ABCDEFG\0(8)の⇒ABDVD-RAMEFG\0(13)
この例だと、mallocで8のサイズの領域を作成、しかし変換後は13文字になる。
そしたら領域から文字列から溢れる。
変換後にどれだけの文字数になるか分からないのでめいっぱい領域確保するという手もあるのですが
領域は出来るだけ抑えたいと思っています。

これの解決方法を教えてください。
97デフォルトの名無しさん:2006/04/26(水) 21:34:49
変換が高々一回なら、元も文字列から5文字増えるだけでは?
98デフォルトの名無しさん:2006/04/26(水) 21:47:18
変換前文字列も変換文字列も、不定ということです。
それに変換場所が一箇所とは限らない。

例)
AをANSYA変換だとすると
KOUDAGAKUTO⇒KOUDANSYAGANSYAKUTO

同じところはもう一度変換しないとして、
変換する文字列が何回出てくるか数えてからmallocなんですかね?
99デフォルトの名無しさん:2006/04/26(水) 22:28:26
どっかにC machineをダウンロードできる所ないかな?
100デフォルトの名無しさん:2006/04/26(水) 23:24:08
入力されたいくつかの数字を大きい順に並べるプログラムってどうやって書けばいいですか?
並べる方法が分かりません、ヒントください。
101デフォルトの名無しさん:2006/04/26(水) 23:25:55
宿題スレで聞くといいよ
102デフォルトの名無しさん:2006/04/26(水) 23:26:07
qsort
103デフォルトの名無しさん:2006/04/26(水) 23:26:16
>>100
入門書でも買ってきたら?
104デフォルトの名無しさん:2006/04/26(水) 23:33:27
>>100
ifBがAよりLargeならA and Bをchenging汁。
105デフォルトの名無しさん:2006/04/26(水) 23:39:29
chengingてwwwwwwwwww
106デフォルトの名無しさん:2006/04/26(水) 23:57:36
>>100
一個ずつ全部比べて並び替え
107デフォルトの名無しさん:2006/04/27(木) 00:05:12
system(sort);で全て解決
108デフォルトの名無しさん:2006/04/27(木) 02:12:53
chengingあげ
109デフォルトの名無しさん:2006/04/27(木) 02:14:04
chenging!!
chenging!!
110デフォルトの名無しさん:2006/04/27(木) 02:15:34
スペルミスはさておき、意味がわからんな
swapしろと言いたかったのかな
111デフォルトの名無しさん:2006/04/27(木) 02:57:57
>>110
通報しました
112デフォルトの名無しさん:2006/04/27(木) 03:20:49
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++がどうしても上手く表現できません
113デフォルトの名無しさん:2006/04/27(木) 03:31:31
暗号解読班、出動だ!
114デフォルトの名無しさん:2006/04/27(木) 03:34:16
× *i *= 0;
○ *i *= 10;
115デフォルトの名無しさん:2006/04/27(木) 03:34:41
>>112
*i *= 0; は *i *= 10; の間違いだよな?
SKIP関数がなにするのかよくわからんけど大体あってるんじゃね?
116112:2006/04/27(木) 03:37:52
すいません、*i *= 10;の件は間違いでした。

御指摘ありがとうございます。
このソースをどのような処理をしているかがどうしても説明できなくて困ってます。
仕様書を書かなくてはならなくてそれがどうしても出来ない状態です・・・・
117デフォルトの名無しさん:2006/04/27(木) 03:38:36
>>116 宿題スレと同時爆撃しないでくれ
118デフォルトの名無しさん:2006/04/27(木) 03:40:02
>>117
すませんです。
かなり切羽詰ってて。
とりあえず自分でも調べておきます。
後でまた見ます。それでは
119デフォルトの名無しさん:2006/04/27(木) 09:44:42
>>116
> このソースをどのような処理をしているかがどうしても説明できなくて困ってます。
> 仕様書を書かなくてはならなくてそれがどうしても出来ない状態です・・・・

中身を理解していないからだ。
そもそも、仕様書はコーディング前に書くものであって、
コーディング後に書くものではない。
120デフォルトの名無しさん:2006/04/27(木) 10:57:02
>>119
>コーディング後に書くものではない。
…えっ!?
121デフォルトの名無しさん:2006/04/27(木) 11:00:48
マ板なら納品前にでっち上げるのが常識
ム板ならソースを書く前に完成しているのが常識 > 仕様書
122デフォルトの名無しさん:2006/04/27(木) 11:01:33
>>98
realloc、足りなくなったら再確保しろ
123デフォルトの名無しさん:2006/04/27(木) 11:20:20
>>98 ま、事前に数えるのも数行程度のコードで済むだろうから、
数えるコードを書いてもいいかもしれない。
元の文字列がたいしたサイズでなかったら、無条件に三倍程度の
サイズをmalloc()でもいいだろうし。
124デフォルトの名無しさん:2006/04/27(木) 12:00:08
質問なんですが、整数a,b,cを与えたとき、ax^2+bx+c=0の解を求めるプログラム教えてくれないですか?
コンピュータ苦手で
125デフォルトの名無しさん:2006/04/27(木) 12:07:16
>>124
宿題なら宿題スレへ。
アルゴリズムを知りたいならアルゴリズムスレへ。
そうでないなら初心者向けスレへ。
126デフォルトの名無しさん:2006/04/27(木) 12:27:28
>>124
つ解の公式
127デフォルトの名無しさん:2006/04/27(木) 12:30:16
>>124
> コンピュータ苦手で

じゃあ、使うな
128デフォルトの名無しさん:2006/04/27(木) 12:50:36
>>112
おそらく、
文字列を十進数字とみなしてその値を引数に返す関数。
129デフォルトの名無しさん:2006/04/27(木) 16:02:29
いきなり書き込みしてすみません!
今、C言語の勉強してるんですけど、テキストファイルとバイナリファイルの差って何ですかね?
ちなみにバイナリファイル以外がテキストファイルです。っていう答えは無しでおねがいします。
130デフォルトの名無しさん:2006/04/27(木) 16:07:12
データが全部文字コード(ASCIIとかS-JISとかUnicodeとか)
で構成されているファイルがテキストファイル
131デフォルトの名無しさん:2006/04/27(木) 16:14:39
バイナリファイルの部分集合がテキストファイル

印字可能な文字集合 + 空文字(改行コード/SPC/TAB) のみのバイト列で構成されてる
…で良いのか?

# 文字セットのこと考えると難しいねぇ
132デフォルトの名無しさん:2006/04/27(木) 16:15:14
嘘を書くな
133デフォルトの名無しさん:2006/04/27(木) 16:19:42
>>129
ファイルの扱い方の違い。どんなファイルも0と1のデータが並んでるだけ。
バイナリファイルとして扱えば1バイト読み込むとかが出来るし。
テキストファイルとして扱えば1文字読み込むとか1行読み込むとかが出来る。
ただテキストファイルとして扱ったときに文字を表すデータが入ってないと文字化けしたり変な挙動したりする。
134デフォルトの名無しさん:2006/04/27(木) 16:22:54
ありがとうございます!
テキストファイルの事はよくわかりました。
まだ、バイナリファイルが良くわからないのですが?
135デフォルトの名無しさん:2006/04/27(木) 16:23:21
分かってねーじゃんw
136デフォルトの名無しさん:2006/04/27(木) 16:28:49
すいませんf^^;
133を読む前に書いてしまったので・・・。
137デフォルトの名無しさん:2006/04/27(木) 16:31:34
ということは、バイナリファイルの方が小さい単位で利用できるって事でよろしいのでしょうか?
あと、バイナリファイルで読む込んだものをテキストファイルとして利用できるのですか?
138デフォルトの名無しさん:2006/04/27(木) 16:35:37
説明しても無駄なようだ。
139デフォルトの名無しさん:2006/04/27(木) 16:36:38
例えば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じゃないとだめだったと思う、他にも・・・あったかな、忘れた。
140デフォルトの名無しさん:2006/04/27(木) 16:38:35
そんな環境依存の話されても・・・
141デフォルトの名無しさん:2006/04/27(木) 16:41:24
>139訂正
>0から31
0から32
>1〜32
0から32

要は使えないのは0〜32(ヘキサで00〜20)と127(同じくff)
(あ、\rと\nは省いて)

>>138
「説明できないのは分かっていない証拠」
と教えてもらったことがある
142デフォルトの名無しさん:2006/04/27(木) 16:42:56
>>141
わかってないなら説明しなきゃいいのに。
143デフォルトの名無しさん:2006/04/27(木) 16:48:26
>バイナリファイルというのは、CPUが実行できるマシン語だから、
いつからバイナリファイル=マシン語になったんだ?
144デフォルトの名無しさん:2006/04/27(木) 16:50:40
>>141
>「説明できないのは分かっていない証拠」
まあ、>>139 みたいに説明されると
「ああ、こいつまるで解ってねーや」ってのが判断できるわけだしね。

>>137
はっきりした定義があるわけじゃない。
とりあえずメモ帳で開いて、半角中黒が使われてなければテキストファイルだと思っとけ。

このスレ的には、「一部の環境 (OS、コンパイラ) では、ファイルオープン時にテキストだと明示
すると、改行コードや文字コードの変換をしてくれる “かもしれない”」としか。
145デフォルトの名無しさん:2006/04/27(木) 16:51:37
>あと、バイナリファイルで読む込んだものをテキストファイルとして利用できるのですか?
例えば、メモ帳だと、認識できないコードは■になる。(要は、エディタやエンコードによる)
それで利用できるなら使える。
146デフォルトの名無しさん:2006/04/27(木) 17:00:49
>143
まあ、確かに。
バイナリと一言にいっても広いし。
例えば、圧縮解凍ソフト作って、圧縮ファイルの拡張子を.binにしたっていいわけだし。
147デフォルトの名無しさん:2006/04/27(木) 17:02:49
メモ帳だとUnixのテキストファイルが1行になってしまう訳だが...
148デフォルトの名無しさん:2006/04/27(木) 17:04:05
テキストもバイナリファイルの1種に過ぎないし
149デフォルトの名無しさん:2006/04/27(木) 17:17:30
全てのファイルはバイナリだ。
プログラムの側はそれをテキストとして扱うかどうかを決められるに過ぎない。
テキストとして書いたファイルは同じシステムや互換性のあるシステムでテキスト
として読むことが可能ということ。互換性のないシステムではそのままでは
テキストとしては扱えないかも知れない。扱えない場合はバイナリとして開いて
自分で変換しながら読むとか、あるいは予め変換してから読むことになる。
150デフォルトの名無しさん:2006/04/27(木) 17:36:11
パイプもコンソールもプリンタもファイルの1種だが、バイナリなのか?
151デフォルトの名無しさん:2006/04/27(木) 17:39:51
MSがテキストだのバイナリだのくだらん事を広めたのが悪い
152デフォルトの名無しさん:2006/04/27(木) 17:49:38
>>150
内容はバイナリだよ。
扱い方がテキストだったり画像だったりするだけ。
153デフォルトの名無しさん:2006/04/27(木) 17:55:49
>>129
エディタで開いてみて、文字っぽかったらテキストファイル。
154デフォルトの名無しさん:2006/04/27(木) 17:56:06
>>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進法で画面出力される。
155デフォルトの名無しさん:2006/04/27(木) 18:00:00
>>154
で?
156デフォルトの名無しさん:2006/04/27(木) 18:59:21
テキスト形式ファイル
形式にすぎない
おわり
157デフォルトの名無しさん:2006/04/27(木) 20:00:23
で、
制御コードはファイル内だけにとどまらず、
オブジェクト間、ファイル間、プロトコルにもあるわけだけど、
BASE64に話が続くかと思いきや、やっぱりでないか。
前者2つは思いっきり環境依存だからしようがないと言えば、しようがない
158デフォルトの名無しさん:2006/04/27(木) 20:15:15
159デフォルトの名無しさん:2006/04/27(木) 20:52:44
>>158
pbm/pgm/ppm画像は?
160デフォルトの名無しさん:2006/04/27(木) 21:42:20
>>154
自分の知っている、うんちくを語りたかっただけです
( ´,_ゝ`)プッ
161デフォルトの名無しさん:2006/04/27(木) 21:45:50
>>151
確かにlinuxの場合もファイル操作する場合拡張子なんて意識しなかった
希ガス
162デフォルトの名無しさん:2006/04/27(木) 21:49:27
>>161
ハァ?拡張子??なんでそんなもんがでてくるんだ?
163デフォルトの名無しさん:2006/04/27(木) 21:51:24
コンパイラについて教えてください。
下のようにしたら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
164デフォルトの名無しさん:2006/04/27(木) 21:58:28
>>163
つ __GNUC__
165デフォルトの名無しさん:2006/04/27(木) 22:08:51
さっそくありがとうございます
__GNUC__は、gccですよね?
それとこういうことが詳しく載ってるサイトは知らないでしょうか?
自分用にライブラリ付くリョウと思っています。
166デフォルトの名無しさん:2006/04/27(木) 22:17:39
>>163
#elif defined(__GNUC__)
167デフォルトの名無しさん:2006/04/27(木) 22:33:07
>>165
コンパイラ判別用のマクロなら、↓ここの Compilers とか
Pre-defined C/C++ Compiler Macros
ttp://predef.sourceforge.net/index.php
168デフォルトの名無しさん:2006/04/27(木) 22:45:18
結構多いですね。。。
このなかでよく使われているコンパイラってどんだけあるの?
ここを見た限り、VC++は_WIN32より_MSC_VERで判定したほうがいいの?

ちなみに私は英語苦手なのでまだ軽くしか見ていません。
間違ってても気にしないで!
169デフォルトの名無しさん:2006/04/27(木) 22:46:38
>>168
ちゃんと見てから言えよ・・・
170168:2006/04/27(木) 22:55:52
>>169
たった今確認しました。(翻訳サイトで)
うん、やっぱりそれっぽいこと書いてる!!
171デフォルトの名無しさん:2006/04/27(木) 23:18:30
int i[3]; って宣言して
i[5] = 10; と入れてもエラーにならないのはなぜですか?
172デフォルトの名無しさん:2006/04/27(木) 23:19:34
エラーじゃないから。
173171:2006/04/27(木) 23:20:46
>>172
論理的にお願いします。
174デフォルトの名無しさん:2006/04/27(木) 23:24:00
動的に配列の範囲チェックを行ってエラーを出すような機構がないから。
175171:2006/04/27(木) 23:25:57
>>174
どうもありがとうございます。なんとなく理解できました。
176デフォルトの名無しさん:2006/04/27(木) 23:27:57
>>171の例では、静的でもいいんじゃないかと。
177デフォルトの名無しさん:2006/04/27(木) 23:32:37
別な所でエラーが出るかもしれないがなー。
178デフォルトの名無しさん:2006/04/27(木) 23:35:21
たとえば?
179デフォルトの名無しさん:2006/04/28(金) 00:09:36
C言語の配列というのは単に配列の宣言時に指定した長さ分の連続したメモリ領域で、
配列の変数が表しているのは配列の先頭要素へのポインタに過ぎない。
そのポインタをインデックスで指定された分だけオフセットして各要素にアクセスしている。
したがって、配列の長さを超えるようなインデックスを指定しても、
その参照先のアドレスが予めプログラムが確保しているメモリ領域に収まっていれば、
必ずしもエラーにはならない。
ただし、その参照先のアドレスは、他の変数などに割り当てられている可能性があり、
その内容を書き換えれば意図しない動作をもたらすことがある。
180デフォルトの名無しさん:2006/04/28(金) 00:10:19
コンパイラがたまたまiの近くに配置した領域を上書きするとか

つうか聞いてばかりじゃなくてやってみれ
181デフォルトの名無しさん:2006/04/28(金) 00:33:27
どうやればエラーでるの?
182デフォルトの名無しさん:2006/04/28(金) 00:37:21
エラーすら出ない環境もあるが、
例えば、アクセスを試みて、アクセスできなかった時などがある。
183デフォルトの名無しさん:2006/04/28(金) 00:39:17
>>182
論理的にお願いします。
184デフォルトの名無しさん:2006/04/28(金) 00:47:27
#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;
}
185デフォルトの名無しさん:2006/04/28(金) 00:50:17
エラーでコンパイルができません。
186デフォルトの名無しさん:2006/04/28(金) 00:51:33
うそーん。全角スペースを半角に直した?
187デフォルトの名無しさん:2006/04/28(金) 00:54:19
windows.hなんてありません
ふざけないでください
188デフォルトの名無しさん:2006/04/28(金) 01:15:30
環境はVisualCでは否なのか
ならwindows.hはない
あと仮にVC環境ならスペースは受け付けない、すべてTABにしな
189デフォルトの名無しさん:2006/04/28(金) 01:16:00
配列の質問です。
配列を宣言したときにメモリが確保されると思うのですが、
そのとき確保されるメモリアドレスは連続したものなのでしょうか
具体的にいうと
char gefo[100];
と定義して
&gefo ++;
を400回繰り返した場合、最後にはgefo[100]用のメモリの
一番後ろのバイトに到達していると考えていいものでしょうか?
190デフォルトの名無しさん:2006/04/28(金) 01:19:25
>>189
400は普通に通り越してるよね?
191デフォルトの名無しさん:2006/04/28(金) 01:22:11
返信ありがとうございます。
そうなんですか・・・・
char型は4バイトだからポインタ演算?するときは
配列100個だったら、400回たすのかなーと考えてたんですが;
192デフォルトの名無しさん:2006/04/28(金) 01:23:37
>189
違う、連続していない
だから、逆に配列はアセンブラじゃなくCで書いたほうが効率がよいのができたりする。
違う型を含む構造体ももちろんそう。
どう飛ぶかはCPUの命令セットのアドレッシングの方式による
193デフォルトの名無しさん:2006/04/28(金) 01:23:41
冗談にしては面白みが無いね。
194デフォルトの名無しさん:2006/04/28(金) 01:25:41
&gefo++
って、
&(gefo++) (&gefo)++
のどっちになるんだっけ?
195189: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
になります。
これ、ナニが問題なのでしょうか?


197デフォルトの名無しさん:2006/04/28(金) 01:40:49
本読む前に、手を動かして書いてみろよ
198170:2006/04/28(金) 01:49:58
自作ヘッダーファイルの続きですが、
入れておいたほう便利なものってあります?
199デフォルトの名無しさん:2006/04/28(金) 01:57:29
無い
200デフォルトの名無しさん:2006/04/28(金) 02:03:51
余計なものは入れるな必要最低限だけ入れろ欲張るな
前を見ろ堅実になれ、もっと考えろ想像しろ
以上
201デフォルトの名無しさん:2006/04/28(金) 02:15:17
>>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[]){}
をどっち使ったほうがいいんですか?

203デフォルトの名無しさん:2006/04/28(金) 03:27:54
>>202
どっちでもええ
つーか、どうでもええ
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
205デフォルトの名無しさん:2006/04/28(金) 06:48:10
>>204
これ、なんて書いてあるか分かる?

Throw away the parameters for K&R prototypes.
206デフォルトの名無しさん:2006/04/28(金) 09:01:36
>>191
> char型は4バイトだから

char型は1バイトだ。
# ビット数は環境依存
ついでに、配列型に対して「++」や「--」は出来ない。

>>192
> 違う、連続していない

連続しているから「配列」な訳だが。
207デフォルトの名無しさん:2006/04/28(金) 09:03:44
>>201
char以外でも配列は連続した領域が割り当てられる
208デフォルトの名無しさん:2006/04/28(金) 09:19:41
物理的にメモリに連続して割り当ててなければいけないとするなら
仮想メモリなんて崩壊してしまう
209デフォルトの名無しさん:2006/04/28(金) 10:11:11
>>208
いつ誰が「物理的に」と言ったんだ?
210デフォルトの名無しさん:2006/04/28(金) 10:13:13
C言語で「メモリアドレス」と書かれているのを読んで「物理的」とか思う頭は
なくていいよ?
どっかいけ。
211デフォルトの名無しさん:2006/04/28(金) 10:14:33
じゃあ連続とはどんな意味で言ってたの?
212デフォルトの名無しさん:2006/04/28(金) 10:23:29
C言語から見て連続だろう。
213デフォルトの名無しさん:2006/04/28(金) 10:45:52
>>189が発端?
>>189はメモリアドレスと言っているけど、それが物理アドレスを指しているのか仮想アドレス
を指しているのかは分からないよね。

質問の内容からすると仮想アドレスと取っていいと思うけど。
個人的には、>>192の意見をもうちょっと詳しく説明して欲しい。
214デフォルトの名無しさん:2006/04/28(金) 11:39:39 BE:62112948-
アライメントの話じゃねえの?
char配列を4バイトなり8バイトにアライメントするような処理系があるかどうかは知らんが。
215デフォルトの名無しさん:2006/04/28(金) 11:44:45
配列はパディングを入れないようになってるはずだが。
216デフォルトの名無しさん:2006/04/28(金) 12:18:54
そもそもポインタがアドレスと等しいとは限らないわけだが。
(そんな実装、今時あるかどうかは知らない)
217デフォルトの名無しさん:2006/04/28(金) 12:20:23
パディングだのアライメントだのしらないが、必ず+1で一つずれるのでは
218デフォルトの名無しさん:2006/04/28(金) 12:40:53
>>192はかなりあっちの方にすっ飛んでいって帰って来ない人の意見だろう
219デフォルトの名無しさん:2006/04/28(金) 13:15:54
>>216
ポインタ=アドレス+型 じゃないの?
まあ、この「アドレス」がCPUレベルでの
「アドレス」と等しい必要は無いが。
220デフォルトの名無しさん:2006/04/28(金) 18:12:03
>>219
規格嫁
221192: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デフォルトの名無しさん:2006/04/28(金) 21:38:16
>>221
上も下も連続してるだろ。
223デフォルトの名無しさん:2006/04/28(金) 21:39:45
下のコードのどこを指して、連続してないって言ってるのか。
224デフォルトの名無しさん:2006/04/28(金) 21:47:36
「あ」から「そ」まで連続してないって言いたいんじゃね?
225デフォルトの名無しさん:2006/04/28(金) 21:48:14
>>222-223
実際メモリ見て言ってる?
まさか[]内の数値見て言ってわけじゃ・・
机上の空論言っても堂々巡りだと思うけど
たったこれっぽっちのソース出せば明らかになるじゃん
226デフォルトの名無しさん:2006/04/28(金) 21:50:29
>>224
あー、そういうことか。
喰い違いがあったか。
言ってるとおり、あーお、かーこ、さーそ、の3つは連続していない。
227デフォルトの名無しさん:2006/04/28(金) 21:54:39
>>226
じゃ、具体的にどこが連続してないって言ってるの?
228デフォルトの名無しさん:2006/04/28(金) 21:55:25
> char* name[3];

フツーに連続してる。
229デフォルトの名無しさん:2006/04/28(金) 22:02:08
>>227
確かにデバッグできるコンパイラ持ってない人も居るわけだな。
「お」と「か」、「こ」と「さ」の間はいくつかの00で埋められている。
だからこそ、下の実行結果は
あーそ
で出ずに
あーおで終わる
コード00は「何もしない」を表す。
230デフォルトの名無しさん:2006/04/28(金) 22:02:59
>>225
念のためにVCで実行してみたけど、並んでるようにしか見えない。

main()
{
char *name[3];

printf("%p %p %p\n", &name[0],&name[1],&name[2]);
}

--
結果
0012FF74 0012FF78 0012FF7C
231デフォルトの名無しさん:2006/04/28(金) 22:04:54
>>230
それ、何も値が入ってないけど、判別できんのかいな。
232デフォルトの名無しさん:2006/04/28(金) 22:05:27
連続してない言ってるやつは
ポインタの配列の意味分かってるんだろうか
デバッガの出力より先に理解する事があるだろ
233デフォルトの名無しさん:2006/04/28(金) 22:06:12
>>229
お前あほだろ。
元の質問は、配列が並んでるかどうかの話だろ。

ソース上に現れる文字列リテラルが連続してるなんて、そんな勘違いするやつどこにいる。
234デフォルトの名無しさん:2006/04/28(金) 22:07:31
>>221
こんだけしったかぶって、配列の要素のアドレスと、中に入ってる値の
区別がついてないやつ。
235デフォルトの名無しさん:2006/04/28(金) 22:09:14
これどう解釈をすればいいの?
char*だから、一つ要素に対しての4バイトのメモリ領域を取っている?
配列要素が3つだから全部で12バイト?
236デフォルトの名無しさん:2006/04/28(金) 22:11:38
>>235
「どう解釈」って、まさか>>230のソースのことか?
とりあえず、GW中は入門書でも読んどけ。
237デフォルトの名無しさん:2006/04/28(金) 22:12:06
>232
確かに。例が悪かった。
ただ、確認してみたけど、&name[1],&name[2],&name[3]は連続していずにはるか彼方にある。
通常の**とは違っている。
238デフォルトの名無しさん:2006/04/28(金) 22:13:29
ポインタ理解できない奴はC♯でもやってろよカス
239デフォルトの名無しさん:2006/04/28(金) 22:15:16
>>236
あっ、ごめん。
>>221のソースです。

>>230のように解釈するのが普通と思っていたから。
なんで連続でないって言っているかが不思議に思って。
で、>>230を見ると、4バイトずつ増えているからやっぱり連続だね。
240デフォルトの名無しさん:2006/04/28(金) 22:15:35
>>237
こいつまだ言ってる。
なんか適当に難しそうなこといって、周囲をけむにまくのが習性になってるんだろうな。
241デフォルトの名無しさん:2006/04/28(金) 22:19:36
なるほど
ポインタ死ね
なんていうスレも立つわけだ
242赤ペン先生:2006/04/28(金) 22:20:17
> 237 名前:デフォルトの名無しさん [sage] 投稿日:2006/04/28(金) 22:12:06
> >232
> 確かに。例が悪かった。
       頭が
     (事実歪曲)

> ただ、確認してみたけど、&name[1],&name[2],&name[3]は連続していずにはるか彼方にある。
                                          おらず
                                        (日本語の間違い)

> 通常の**とは違っている。
 脳内の
 (病院池)
243デフォルトの名無しさん:2006/04/28(金) 22:28:21
プログラミングの勉強ばっかりするのもいいけど
たまにはコンピュータの動作原理とかプログラムの動作原理とか勉強するのも無駄にはならないぜ。
244デフォルトの名無しさん:2006/04/28(金) 22:32:08
コンパイラとアドレス方式とアドレス指定方式
245デフォルトの名無しさん:2006/04/28(金) 23:13:24

なんだようやく判ったよ。

>>192は釣りだったって…orz
246デフォルトの名無しさん:2006/04/28(金) 23:24:22
パタヘネぐらい読んどけよ
247デフォルトの名無しさん:2006/04/28(金) 23:29:13
> コード00は「何もしない」を表す。
そうなのか?
248デフォルトの名無しさん:2006/04/28(金) 23:43:43
まあ、釣りなようで釣りでないようで、アドレスバス幅は決まってる。
けど、釣りな結果は運がよかっただけだな。
色々試すとそのうち・・・
>247
NULL
249デフォルトの名無しさん:2006/04/28(金) 23:47:50
>248訂正
アドレスバス幅>データバス幅
250デフォルトの名無しさん:2006/04/28(金) 23:48:07
「コード00は『何もしない』を表す」もNULLもちょっと違う気がする。
251デフォルトの名無しさん:2006/04/28(金) 23:57:37
>>250
だいぶ違うな。
それ使い分けできてないと、本当に素人くさいよな。
つかいわけつーか「コード00は『何もしない』を表す」にいたってはイミ不明だけど。
252デフォルトの名無しさん:2006/04/29(土) 00:02:17
>コード00は『何もしない』を表す
そういや 8080/Z80のNOPは00hだったな。
関係ないけど。
253デフォルトの名無しさん:2006/04/29(土) 00:26:53
惜しむらくは、釣ろうとした張本人の実力が今一歩及ばなかったことか…
254デフォルトの名無しさん:2006/04/29(土) 02:11:53
落ち着いたところで。
惜しまれるから、運が悪かった場合も張っておこう。
#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フラグが立つ。
255デフォルトの名無しさん:2006/04/29(土) 02:14:00
C言ガーにとっては\0と言った方がよかったかw
256デフォルトの名無しさん:2006/04/29(土) 02:15:14
オペランドなら0引く0でZフラグが立つ。
257デフォルトの名無しさん:2006/04/29(土) 02:26:06
x86のNOPは90hだよ。
258デフォルトの名無しさん:2006/04/29(土) 05:06:21
喪前ら低脳晒し大会はいい加減に汁。
259デフォルトの名無しさん:2006/04/29(土) 12:05:26
だってぇ〜、他のお客さんが寄りつかなくて暇なんだも〜ん
260デフォルトの名無しさん:2006/04/29(土) 12:19:27
初心者を惑わすのはかわいそうだからやめてやれ。
261デフォルトの名無しさん:2006/04/29(土) 12:24:32
はじめまして
プログラミング初心者です。
c言語をテキストを買って始めたのですが

C:\work>bcc32 hello.cと入力すると

コンフィグレーションファイル中の オプション間違い:-|"c:\Borland\Bcc55\include"
というエラーが出てしまいます

cfgは こんな感じなんですが
bcc32.cfg
-|"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"

どこが間違っているのでしょうかしょうか?
教えてください。
262デフォルトの名無しさん:2006/04/29(土) 12:25:36
くだらないネタはやめてくれ。
263デフォルトの名無しさん:2006/04/29(土) 12:42:05
>>261
プロバブリー ミス オブ カレントディレクトリ バイ ワークホーム オ〜イエ

ソウ ファーストタイム コマンドクリック bcc32 バイ コマンドプロンプト。

イフ(エラーなら) エンバイアロメンタルバル を アナライズ。 レッツユーゴーイング
264デフォルトの名無しさん:2006/04/29(土) 12:45:51
>>261
>-|"c:\Borland\Bcc55\include"
-I"c:\Borland\Bcc55\include"
ですね
265デフォルトの名無しさん:2006/04/29(土) 12:50:46
さすが黄金週間だなw
266デフォルトの名無しさん:2006/04/29(土) 13:22:17
>>265
春房が涌く季節だから(w
267デフォルトの名無しさん:2006/04/29(土) 13:26:47
hoge( int iCnt, AAA_STR *pAAA );
hoge()関数に、structの配列intのカウンタを渡して、hoge内でカウンタまでstructのポインタを進めて、
構造体の中のデータを加工したりしようとしています。

そこで質問です。
hoge()に渡すカウンタの数値が間違っていて、実際の構造体の配列数より大きい値を渡してしまった場合、
hoge()内で構造体の配列以上の領域を参照・書込みしようとして、プログラムが落ちてしまうことがあります。
このとき、hoge()内で、操作しようとしている構造体の領域が、参照・書込みなどが可能な領域かを
判断する方法はあるのでしょうか?
268デフォルトの名無しさん:2006/04/29(土) 13:34:18
>>267
書き込んで落ちれば書けないと判断できる
269デフォルトの名無しさん:2006/04/29(土) 13:34:42
間違えなきゃいいじゃんか。
どうしてもというならpAAAの最後にはっきりと無効だとわかるデータを用意して
ループ回すたびにチェックしろ。
270デフォルトの名無しさん:2006/04/29(土) 13:43:39
関数内で(配列要素MAX > iCnt)なら実行すれば全て解決
271デフォルトの名無しさん:2006/04/29(土) 13:45:01
配列要素サイズも渡すよろし
272267:2006/04/29(土) 13:46:04
どうもありがとう。
俺も間違えるほうが悪いと思ってたんですが、hogeはdllだかスタティックリンクライブラリだかにすることになってて、
hoge呼び出し側がどんな値渡してもhoge側で異常を関知して、落ちずに異常を返却しろ、といわれて
質問しました。
273デフォルトの名無しさん:2006/04/29(土) 13:56:00
チェックしてからDLLに渡せばいいだろ
274デフォルトの名無しさん:2006/04/29(土) 16:55:00
チェックする関数を提供汁。
275デフォルトの名無しさん:2006/04/29(土) 17:13:58
gcc で -lm っていうオプションがあるのですがこれはどういう意味ですか?
調べても分かりませんですた。
276デフォルトの名無しさん:2006/04/29(土) 17:17:11
>>275
-l で調べれ
277275:2006/04/29(土) 17:46:15
>>276
調べたら、-l(library)で -lmはmから始まるlibraryをincludeするってことであってまつか?
278デフォルトの名無しさん:2006/04/29(土) 18:03:05
>>267
struct MANAGER_STR{
int counter_aaa;
struct AAA_STR *pAAA;
};

で管理すればええ。
279デフォルトの名無しさん:2006/04/29(土) 18:13:48
>>277
includeじゃなくてリンクな。
この場合、リンカがlibmを探してプログラム中で使われているライブラリ関数をリンクする。
280275:2006/04/29(土) 18:29:39
>>279
どうもありがとう!
281デフォルトの名無しさん:2006/04/29(土) 21:48:34
スレ違いの質問に答えるなよ
282デフォルトの名無しさん:2006/04/30(日) 00:05:43
答えらんねー奴は黙ってろ
283デフォルトの名無しさん:2006/04/30(日) 11:05:20
>>272
C++使ってtry...catchで処理しろ、って事ジャマイカ?
284デフォルトの名無しさん:2006/04/30(日) 14:48:36
conio.hにあるgetche()関数を使いたいのですが
gccにありませんでした。同等の機能の関数てないですよね?
285デフォルトの名無しさん:2006/04/30(日) 14:56:07
その質問はスレ違いです
286デフォルトの名無しさん:2006/04/30(日) 15:06:05
>>285
どこがスレ違いなんですか?
287デフォルトの名無しさん:2006/04/30(日) 15:09:47
C言語の関数で文字列を返す事ってできないですよね、
そこで、漏れてきに考えたのだが、
返したい文字列を別の配列として宣言しておいて、
関数でその文字列のポインターを返せるようにしておけば
漏れの脳内ではできそうなのですが、百戦錬磨の諸兄どもは
文字列を返したい場合どうしてマツカ?
288デフォルトの名無しさん:2006/04/30(日) 15:12:36
>>287
>48
289デフォルトの名無しさん:2006/04/30(日) 15:12:58
オルテガさんは華奢な男性かと思ったら、ガチムチ系の兄貴でびっくりしました。
ガチムチオルテガさんは流れるプールの横で懸命にマラをしごいていた。
越中六尺から飛び出している凶器は悪魔そのものですごかった!唖然として
僕が兄貴を眺めてると、兄貴が突然振り向いて眼があってしまい、
そのままオッス!オッス!と連呼して僕に近づいてきた。あとはもうオルテガ
さんの坊主頭が僕の背中を攻め、菊の花をていねいになめまわしまくり、
生物兵器が僕の菊爆弾を何度も何度もオッス!オッス!と鼓動させるのを覚えてるだけです。
ガチムチオルテガさんはすっげー男らしくてなんどもイキまくりました
290デフォルトの名無しさん:2006/04/30(日) 15:13:23
関数を使う前にバッファを用意してそれを関数の引数に与える
関数内でバッファに文字列を書き込む

Cの標準関数でもこうなってる
291デフォルトの名無しさん:2006/04/30(日) 15:16:08
>>286
>>1
> 標準Cではできない事
292デフォルトの名無しさん:2006/04/30(日) 15:24:06
>>291
そうですか、そうですか。
293デフォルトの名無しさん:2006/04/30(日) 15:30:37
ォオー!!(゚д゚屮)屮
>>46で既出してますたスマソ
しかし
>>290氏のアイデアは、Cの標準関数でもこうなってる
と書いてあるものの、斬新な感じがする、漏れも脳内で掘下げて
考えてみます、とこでスレ違いですがついでに知っていたら教えてください
ご存知なければスルーで結構です
NET系の関数も(VS2005のVC8とか)文字列の返せる関数はないですよね?

294デフォルトの名無しさん:2006/04/30(日) 15:35:25
.NETなら文字列クラスを返す関数はたくさんあるんじゃないか
295デフォルトの名無しさん:2006/04/30(日) 15:46:19
>>293
斬新か・・・?
標準関数で例えばsprintfだと
main(){
char buffer[80];
int x = 50;
sprintf(buffer, "x = %d", x);
puts(buffer);
}
こんな感じに使うと思うが、ほんとに斬新だと思う?

ちなみにC++とかなら、string型の変数を返すだけですむのでこんなことしない
296デフォルトの名無しさん:2006/04/30(日) 15:49:44
↑ちなみにそれバッファを0クリアしてないといけなくね?
297デフォルトの名無しさん:2006/04/30(日) 15:54:29
>>296
sprintfはちゃんと末尾にヌル文字入れてくれなかったっけ?
298デフォルトの名無しさん:2006/04/30(日) 15:54:29
>>296
錯覚。そんな余計なことはするもんじゃない。

>>295 >>293
だから>48で既出だってばさ。
299デフォルトの名無しさん:2006/04/30(日) 15:54:34
>>294
そうですか調べて見ます
>>295
関数といえば、直接返すことしか考えられない愚民にとっては十分斬新でした
300デフォルトの名無しさん:2006/04/30(日) 16:16:20
そして頑ななまでにスルーされる>48(=288=298か?)であった。
301デフォルトの名無しさん:2006/04/30(日) 16:18:10
だって48読んでも意味わかんないし
302デフォルトの名無しさん:2006/04/30(日) 16:22:51
303デフォルトの名無しさん:2006/04/30(日) 16:44:07
ん?ありがと・・
304デフォルトの名無しさん:2006/04/30(日) 18:10:14
名前付けの問題です。

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という名前を与えるのは、
ちょっと違和感があります。一般的にこういった関数にはどういった名前付けをするのでしょうか?
305デフォルトの名無しさん:2006/04/30(日) 18:11:21
306デフォルトの名無しさん:2006/04/30(日) 18:15:06
>>305
ありがとうございます。行ってきます。
307デフォルトの名無しさん:2006/04/30(日) 18:19:50
>>304
最後のgetXにreturnがない訳だが...
それ以前に、Cにクラスはない訳だが...
308デフォルトの名無しさん:2006/04/30(日) 18:29:17
>>307
1番目はミスでした。
2番目はよさそうなスレがなかったからです。失礼しました。
309デフォルトの名無しさん:2006/04/30(日) 18:30:16
>>287
関数の参照使っても返せるけど、
strcpy,sprintfがフローチャート的にいけるからスマートだと思う。
ただし、宣言やmemset等で確保した受ける側の領域超えると、スタックオーバーフローになるから気をつけないと(strlenなんかでチェックかけないと)。
310デフォルトの名無しさん:2006/04/30(日) 18:32:58
>フローチャート的にいけるから
関数の参照のように可逆じゃなく不可逆
311デフォルトの名無しさん:2006/04/30(日) 19:42:36
>>309
馬鹿丸だしなレスするくらいなら初心者スレへ。

>>308
あんたも初心者スレくらい見つけなさいよ。

ってことで、>302にこの辺追加。
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/
312デフォルトの名無しさん:2006/04/30(日) 19:52:32
>>309
まれに見るほどの突っ込みどころ満載のレスだな    ・・・わざとらしいんだよ釣り野郎
313デフォルトの名無しさん:2006/04/30(日) 19:56:24
try {
    >>309;
}
fish (>>310-312) {
    プゲラ
}
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;

って書き方あり?
315デフォルトの名無しさん:2006/04/30(日) 20:12:10
宣言の仕方を勉強してください
316デフォルトの名無しさん:2006/04/30(日) 20:16:56
>>315
具体的に何が悪いの?
structのつけ忘れとか、;の付け忘れとかでとりあえず文句言ってるの?
317デフォルトの名無しさん:2006/04/30(日) 20:42:18
>>314
まあ、色々ミスに目をつぶれば、可能だが、
キャストするよりは、&xxx.x を入れた方がいい。
318デフォルトの名無しさん:2006/04/30(日) 20:55:15
Cでオブジェクト指向をやる方法みたいなウンコテクニックを書いてるサイトで、
>>314みたいな書き方をしてたような。
319デフォルトの名無しさん:2006/04/30(日) 20:58:59
>>314
これなら許す。
a *yyy = (struct a *)((char *)&xxx + offsetof(struct b, x));
320デフォルトの名無しさん:2006/04/30(日) 21:00:36
そんな糞コード、後にメンテ依頼される人の身になったら書いちゃ駄目でちゅよ
321デフォルトの名無しさん:2006/04/30(日) 21:06:41
>>320
俺は今まで offsetof を使っているコードで
ロクな目にあったことが無いのだが?
322デフォルトの名無しさん:2006/04/30(日) 21:08:21
>>319
そう書かないと問題が起こるからなの?
でもどういう問題が起こるかちょっと思いつかないんだけど。
323デフォルトの名無しさん:2006/04/30(日) 21:08:59
まぁ直接触らせずにマクロ用意することのほうが多いよな。
324デフォルトの名無しさん:2006/04/30(日) 21:09:43
いや>>319の事をいったのじゃないと思うぞw
325デフォルトの名無しさん:2006/04/30(日) 21:10:44
>>314のこといったのだと思お
326デフォルトの名無しさん:2006/04/30(日) 21:23:58
>>321
C++ ならメンバポインタがあるけどな
あれの代わりを自前でやろうとすると無意味にきつい
327デフォルトの名無しさん:2006/04/30(日) 21:40:25
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'
329デフォルトの名無しさん:2006/04/30(日) 21:46:19
若干端折ってないか?
330デフォルトの名無しさん:2006/04/30(日) 21:47:13
そういう問題じゃねえだろ ぼけ
331デフォルトの名無しさん:2006/04/30(日) 21:50:08
>>327
マジレスすると、
int no;とchar name[10];をメンバに持つ構造体5個分の領域を動的確保して、
そのポインタを格納しようとしているのかな。間違ってるけど。
332デフォルトの名無しさん:2006/04/30(日) 21:54:05
うん、間違ってる
エラーのあるコード=つまりゴミを拾っただけ
そこのサイト主がなぜそんなコードを出しているのかをよく読むことがまず必要
333デフォルトの名無しさん:2006/04/30(日) 22:03:16
typedefした意味が分からない
334デフォルトの名無しさん:2006/04/30(日) 22:13:42
>>333
typedefの閉じカッコの後にセミコロンがないから、
struct FigureをFigureでtypedefしつつ、figure変数を用意してるんじゃね
同名typedefは推奨できないし、後々Figureを使うことがないなら無意味なコードだな
335デフォルトの名無しさん:2006/04/30(日) 22:25:56
figure に figure * 型を代入しようとしているのが間違ってる。
figure自体が型じゃないから二重に間違ってる。
336327:2006/04/30(日) 22:43:42
どこを直せば動くようになりますかね?
337デフォルトの名無しさん:2006/04/30(日) 22:46:05
>>336
全く自分で考えられないならプログラミングなんて止めたら?
338デフォルトの名無しさん:2006/04/30(日) 22:46:32
>>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
生まれてくるときに生まれてくることを自分で考えられた?
考えられないなら生まれてくるの止めるべきだったね。
遅くないから自殺したら?
340デフォルトの名無しさん:2006/04/30(日) 22:58:45
詭弁
341デフォルトの名無しさん:2006/04/30(日) 23:05:27
まあ今後プログラミングをやっていく上で必要なのは
自分で問題を解決する能力、しようとする意欲だからな。
それがないなら止めた方が身のためだろう。
342デフォルトの名無しさん:2006/04/30(日) 23:13:54
>>339
はっはっは逆切れしてんじゃないよw
そのまま困ってろw
343デフォルトの名無しさん:2006/04/30(日) 23:18:10
最近の子はすぐキレますね
344デフォルトの名無しさん:2006/04/30(日) 23:36:36
流石、黄金週間だな
345デフォルトの名無しさん:2006/05/01(月) 19:38:46
スレ違いかもしれませんが、gccで数値計算をさせてるんですが
CPUを100%活用して計算させる事って可能でしょうか?
346デフォルトの名無しさん:2006/05/01(月) 19:46:15
「CPUを100%活用する」の定義を書け
347デフォルトの名無しさん:2006/05/01(月) 19:46:34
また随分と抽象的な質問だなぁ。
「CPUを100%活用する」するとはどういう概念のつもりなのかね。
いずれにしても、スレ違いなのでCPUスレなり環境依存スレなり探してネット。
348デフォルトの名無しさん:2006/05/01(月) 19:57:04
質問します。

私は、セレロンを使用してますが、一時的に割り込み禁止にして
かつ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デフォルトの名無しさん:2006/05/01(月) 20:02:42
>>349
つ[%lf]

>>348
スレ違い。
351デフォルトの名無しさん:2006/05/01(月) 20:09:20
>>350
入力は%lfじゃないと駄目なんですか。ありがとうございました。
352デフォルトの名無しさん:2006/05/01(月) 20:10:10
>>350
書式指定と変数の型が違う時ってどうなったんだっけ?
353352:2006/05/01(月) 20:22:17
ああ、そうか。
読み取った数値を float だと思って(大抵 16bit) double の領域(大抵 32bit)に書き込むから、読み出した時におかしくなるんだな。
354デフォルトの名無しさん:2006/05/01(月) 21:04:15
>>348
処理時間の計測ならプロファイラ使え
355デフォルトの名無しさん:2006/05/01(月) 22:19:56
推奨されるソースの記述方が詳しく載ってるサイトってないですか?
大文字や _ などの使いどころがいまいちわからないもので・・・
356デフォルトの名無しさん:2006/05/01(月) 22:30:09
>>355
コーディングスタイルで検索したらいろいろ出てこない?
357デフォルトの名無しさん:2006/05/01(月) 22:59:04
>>355
主観的なものなんだから、推奨もクソもないだろ。
そもそも、誰が推奨するのかと(ry
358デフォルトの名無しさん:2006/05/01(月) 23:08:52
>>355
それは自分の周りの人との協定であって
どこぞのサイトだの誰それが言ってるから正しいんだぁぁぁぁ〜みたいな、
だだをこねるオナニー小僧が全てを超越して最も迷惑

仕事は中身で勝負するのが本質であって
コーディング基準を破って得意がることには誰も金を払う価値を感じない

協調性の低い人は組織には向かないんで
一人で完結できる仕事をしたほうが自分と世のため
359デフォルトの名無しさん:2006/05/01(月) 23:12:53
ただ_で始まる識別子はマズー
__hoge
とふたつ付ければいいじゃんと言われてめまいを起こした記憶が
360デフォルトの名無しさん:2006/05/01(月) 23:15:15
>>356
参考になりました。ありがとうございます
>>357-358
確かに他人の主観は自分に置かれてる環境と=で結びつかないですね
あくまで参考にするまでに留めておきます
361デフォルトの名無しさん:2006/05/01(月) 23:18:25
>>359
恥をしのんで訊くけど、_で始まる識別氏ってどういうところが拙いの?
362デフォルトの名無しさん:2006/05/01(月) 23:21:14
>>361
処理系用に予約されている。
細かい話をすると _ で始まるもの全部ってわけじゃないが、
混乱を招くので _ で始めない方がいい。
363デフォルトの名無しさん:2006/05/01(月) 23:26:10
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
たぬき
368デフォルトの名無しさん:2006/05/01(月) 23:33:23
コンパイルエラー(リンクエラーかな?)で `hoge.dll@_hoge が見つかりません' とか
言われるけどそのときの _ と同じ?
369デフォルトの名無しさん:2006/05/01(月) 23:38:19
昔、職場で、_一文字の変数を使ってる人をみて、ショックを受けたことがある。
370デフォルトの名無しさん:2006/05/01(月) 23:39:46
>>365
そういうセリフは規格見て確認してからにしてはどうか?
371デフォルトの名無しさん:2006/05/01(月) 23:48:53
ひたすら高速無限ループする処理があります。グローバル変数を直接も参照するよりも、
関数内にグローバル変数のポインタを作って、よりループに近い位置(?)のポインタを
参照させた方がコストは低くなると考えて良いでしょうか?

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でも使っている
コンパイラにおこられたことはないよ
374デフォルトの名無しさん:2006/05/01(月) 23:57:06
>>371
そういう、どういう書き方が速いかって問題は、実際に
計測してみないとわからんよね。
375デフォルトの名無しさん:2006/05/01(月) 23:58:21
>>363
それはVisual C++という処理系が自分独自の関数・変数などに使っており、きわめて正しい使い方だ。

>>365
つ規格書。jiscでX3010。

>>368
違う。
376デフォルトの名無しさん:2006/05/02(火) 00:00:04
>>373
重症だな…
377デフォルトの名無しさん:2006/05/02(火) 00:00:39
>>376
構造体のメンバでもか?
378デフォルトの名無しさん:2006/05/02(火) 00:02:58
>>373
予約と言っても大抵の処理系では特に弾くことも無いので、
実際に名前の重複が起こってエラーにならなければ、我々が使ってもコンパイルできてしまう。

言わば紳士協定のようなもの。
379デフォルトの名無しさん:2006/05/02(火) 00:05:24
>>371
そういう「ポインタは速い」って言う思い込みによる、
「エセ高速化」ほど迷惑極まりないものはない。


高速化したいなら、プロファイラなどで処理時間を計測し、
ボトルネックを探す事から始めろ。
380デフォルトの名無しさん:2006/05/02(火) 00:07:01
つまり、>373は無頼の輩と言うことだな。
381デフォルトの名無しさん:2006/05/02(火) 00:10:02
>>379
どう書けば速そうかの見当のつけ方は必要だろ
ボトルネックに関してはそのとおりだが
382≠379:2006/05/02(火) 00:13:28
>>381
それじゃ、プロファイリングもせず実測もせずアセンブルリストを眺めることもしないで流言卑語に惑わされるようなことでは高速化なんて夢のまた夢だな。
383デフォルトの名無しさん:2006/05/02(火) 00:21:52
>>381
式「globe」:変数の参照のみ
式「*p」:変数の参照+*演算子による演算


>>371の例なら、ポインタの方が遅くなりそうに感じないかね?

実測もせずに↑の様な事を言い出しても、説得力ないだろ?
どう書けば速くなるか?は、実測した後で十分。

そこがボトルネックじゃなければ、考えるだけ無駄。
384デフォルトの名無しさん:2006/05/02(火) 00:28:20
今までプロファイラというものは聞いたことがあっても
使ったことはありませんでした。

今日使ってみて自作のメモリクリア関数とmemsetを競わしたら
自作とmemsetでは300サイクルもの違いがありました。
クリアバッファは1024byteです。

やはりmemsetを超えることはできないのか・・・・?
385デフォルトの名無しさん:2006/05/02(火) 00:28:56
>>383
ポインタ変数がレジスタに割り当てられて、グローバル変数のアドレスが即値で扱われるとか
そういう感じだったらアーキテクチャによっては、ポインタのほうが速くなるね。
最適化によって、グローバル変数には毎回見にいかないかもしれないし。

とにかく実際にみてみないとわからんよ。
386デフォルトの名無しさん:2006/05/02(火) 00:32:16
>>383
それじゃ試すべき選択肢が発散するだろ
387371: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
真っ黒
391デフォルトの名無しさん:2006/05/02(火) 01:11:52
>>373みたいな奴、たまにいるよ派遣で。
392デフォルトの名無しさん:2006/05/02(火) 01:14:57
>>391
君のところはコーディング規約がないのか?
393デフォルトの名無しさん:2006/05/02(火) 01:20:54
もうやめて!わたしをうばいあうためにあなたたちがあらそうことはないわ!
394デフォルトの名無しさん:2006/05/02(火) 01:22:31
フヘヘ… こやつめ…
395デフォルトの名無しさん:2006/05/02(火) 01:41:43
下みたいに、自前でメモリ空間確保してやって、あとは先頭の配列だけ渡すようなプログラムは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);
}
396デフォルトの名無しさん:2006/05/02(火) 01:54:55
>>395
void* の演算って、OKだっけ?
コンパイル通る?
397デフォルトの名無しさん:2006/05/02(火) 01:57:29
gcc 4.03だと通るんだけどやっぱりやべぇよなぁと
思いつつ確認したいと思い質問させていただきました。
398デフォルトの名無しさん:2006/05/02(火) 02:03:07
>>397
まじで?
数字で始まる識別子使えるのか?

まあ、ここに載せるのに置換しただけだとは思うけど。
399デフォルトの名無しさん:2006/05/02(火) 02:04:29
>>397
VC6でコンパイルしてみたら、サイズが定義されていませんってエラーになった。
400デフォルトの名無しさん:2006/05/02(火) 02:06:03
ほんとうだ。
識別子が数字で始まってる。
gccおそるべし。

互換性に関するオプションを調べて、指定したほうがいいかも。
401デフォルトの名無しさん:2006/05/02(火) 02:10:36
4.0.3 ubuntuだと通る不思議だVC6通らない
402デフォルトの名無しさん:2006/05/02(火) 02:12:51
あ、ちなみに変数名間違って数字にしちゃったみたい本当はwchって
するよていだったゴメン
403デフォルトの名無しさん:2006/05/02(火) 02:16:33
念のためにVS2003のCでも、ためしたけど、void*の演算はエラーだった。
404デフォルトの名無しさん:2006/05/02(火) 02:17:55
-ansi -pedantic-errors 付ければ?
C99なら -std=c99 -pedantic-errors
405デフォルトの名無しさん:2006/05/02(火) 02:22:34
おお、エラーになるな。こりゃいかんな
でこの場合どうするんでしたっけ?
JAVA3年ばかりやっていてこの辺さっぱり
忘れました。悲しくなってきました
406デフォルトの名無しさん:2006/05/02(火) 02:32:55
えーとchar *で領域とって値を返すときはvoid *にキャストすればいいんだっけ?
407デフォルトの名無しさん:2006/05/02(火) 02:36:26
たぶんそれでエラーでなくなったからOKなのかな?
408デフォルトの名無しさん:2006/05/02(火) 02:38:10
>>406
それはそれで、まずいこともある。
409デフォルトの名無しさん:2006/05/02(火) 04:34:16
>>986
そんな危なっかしいことしないで、memsetとsizeof使いなよ。
410デフォルトの名無しさん:2006/05/02(火) 04:54:36
それと、sizeの連結にはstrcat使ってさ、それが堅実だよ。
strシリーズはchar*型の独壇場だし。
構造体とかオブジェクトとかの集合なら、
アクセス関数(set()やget())使って、値渡し&returnが理想だけど、
厳しいなら、アクセス関数の参照使って中でOne or 数クッション置いたり、中でカウンター回して、値変化の双方向の影響汲まないといけないんだろうけど。
411デフォルトの名無しさん:2006/05/02(火) 08:26:22
>>348
できるけど、割り込み禁止した状態で使う
用途に適用するんじゃなければ意味が無い。
100万回繰り返して平均とっとけば十分だろ。
412デフォルトの名無しさん:2006/05/02(火) 19:32:41
>>348
OSに頼んで自分のCPU優先度を最強にするとかいうのはどう?

またWindowsにはマイクロ秒単位で計測する方法がある。詳しくはWin32APIスレなどで聞け。
413デフォルトの名無しさん:2006/05/02(火) 20:12:37
いつまでスレ違い野郎の相手をするつもりだヴォケ。
414デフォルトの名無しさん:2006/05/03(水) 05:47:11
>>348
同じ目的に対する複数のアルゴリズムや最適化パターンを比べるつもりなら
本番環境と同じ条件でテストしないと「最速」が変わってしまう可能性があるぞ
特にそういうデカい CPU はキャッシュや分岐予測が速度に大きく影響するから
他のタスクをブロックするとあさってな結果がでる
415デフォルトの名無しさん:2006/05/03(水) 07:00:49
>>414
のうたりん?
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
422デフォルトの名無しさん:2006/05/03(水) 12:36:12
>>417
足りぬの語尾が撥音便化したものだろう。
423デフォルトの名無しさん:2006/05/03(水) 12:56:04
どこで聞いたらいいのか分からないんでここで質問させてもらいますが
丸め誤差って必ず実際の値より小さくなりますよね?
424デフォルトの名無しさん:2006/05/03(水) 12:57:31
丸め方による
425デフォルトの名無しさん:2006/05/03(水) 13:00:10
どんな丸め方をしても、実際の値より小さくない場合は有ると思う。
実際の値以下でない場合は無いかもしれない。
426デフォルトの名無しさん:2006/05/03(水) 13:03:21
どうも。勉強します。
427デフォルトの名無しさん:2006/05/03(水) 13:22:11
>>415
どうてい?
428質問:2006/05/03(水) 14:38:24
printfやscanfの変換指示文字について
long double型の場合は「%f」であってますか?
誰か教えてください、お願いします。
429デフォルトの名無しさん:2006/05/03(水) 14:44:15
>>428
printfでは%fがdoubleだが、scanfでは%lf。

scanfでの%fはfloat。
printfで%lfは間違い。float型引数もここではどうせdoubleに格上げされるため。
(いわゆるC99では%lfも認められたが)
430デフォルトの名無しさん:2006/05/03(水) 14:47:41
>>428
どちらも%Lfだな。
ま、使ってるコンパイラのマニュアル見たほうが正確。
431428: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
になってしまうのですがなぜだかわかりますか?
432デフォルトの名無しさん:2006/05/03(水) 14:51:57
>>431
%1.0fでやってみろ
433428: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
ハッシュ法のことで質問なのですが
探索・挿入・削除などの作業時に際して
空き領域に到達するとなぜ失敗ということになるのでしょうか?

あとハッシュ法の意義があまり分からないのです…
435429:2006/05/03(水) 14:57:03
_| ̄|○
寝ぼけてた
436デフォルトの名無しさん:2006/05/03(水) 15:14:40
>>431
(C99)規格ではおそらく%Lf。
但し、それをサポートしてるかどうかは
使ってるコンパイラのマニュアル確認するのが確実。
437デフォルトの名無しさん:2006/05/03(水) 15:45:22
>>434
ハッシュ機能の関数は次のよう
hoge HASH(foo,・・・){
//文字列aをアドレスに変換
//対象のメモリのアドレス値を返す
}
だから、アドレスが見つからないと0xCCを返したりして、エラーになる。
ハッシュ法の意義>インデックスみたいなもんだよ。高速検索機能。
438デフォルトの名無しさん:2006/05/03(水) 15:55:02
>文字列aをアドレスに変換
値渡しor参照渡しされた文字列をアドレスに変換
439デフォルトの名無しさん:2006/05/03(水) 16:00:31
なぜ唐突に0xCCが出てくるかわからない。
440デフォルトの名無しさん:2006/05/03(水) 16:09:35
例えば、文字列"HASH"をハッシュ関数を通すと、
[昔はハッシュ機能を使ったキャッシュ機能(ハード、CPU)もあったらしいけど、]
頭がHで始まる内容を持ったアドレスを返したって絞り込めている。
これは、いわゆるソートが掛かっている場合だけど、
データ集合にインデックス項目作って、インデックス機能を作ればソートかかって無くてもいける。
441デフォルトの名無しさん:2006/05/03(水) 16:12:12
Cで作ったバイナリで値なしは0xCC・・・で埋められることが多い。
442デフォルトの名無しさん:2006/05/03(水) 16:13:58
>頭がHで始まる内容を持った先頭アドレス
443デフォルトの名無しさん:2006/05/03(水) 16:17:39
>>434
"空き領域"とは何のことを指しているのかがわからなければ答えようが無い。
444デフォルトの名無しさん:2006/05/03(水) 16:18:47
>>441
もしかして、変数を初期化しないで使ってないか?
VCあたりで。
445デフォルトの名無しさん:2006/05/03(水) 16:21:53
>>440
本人も意味が分かって書いてるのだろうか。
446デフォルトの名無しさん:2006/05/03(水) 17:14:08
>348
一万回ぐらい同じ処理を実行して、平均取ればいいじゃないか。
447デフォルトの名無しさん:2006/05/03(水) 19:13:56
今C習い始めなんですが(学校で)、
漸化式の次の項ってどうやって表示すれば良いんでしょうか?
前の項と次の項の差を出したいんですが・・・
448デフォルトの名無しさん:2006/05/03(水) 19:19:01
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;
}
449448: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 にしてやり直しておいで
451デフォルトの名無しさん:2006/05/03(水) 19:24:21
>>448
コンパイルオプションとかでUNICODEが定義されてんじゃね?

↓だから、こういうスレ立ててまで世間に警鐘をならしたのに。。。
http://pc8.2ch.net/test/read.cgi/tech/1144387445/l50
452448:2006/05/03(水) 19:28:02
dクス
.Cにしたらできました。
>>451
コソパイルオプション?
453448:2006/05/03(水) 19:31:15
winmain.c(8) : warning C4133: '関数' : 'PSTR' と 'LPCWSTR' の間で型に互換性がありません。
ビルドできますがこう出ます
454デフォルトの名無しさん:2006/05/03(水) 19:31:17
>>452
プロジェクトのプロパティでMBSとかUNICODEとかを指定するところない?
455448:2006/05/03(水) 19:36:30
>>454
dクス
文字セットを
マルチ バイト文字セットを使用する
に変更したら警告が出なくなりました。
よかったよかった
456デフォルトの名無しさん:2006/05/03(水) 19:47:12
>418-421
これってなに?
457デフォルトの名無しさん:2006/05/03(水) 19:56:28
ダンプ松本
458デフォルトの名無しさん:2006/05/03(水) 20:00:16
逆汗
459デフォルトの名無しさん:2006/05/03(水) 20:01:25
文字列を二桁ずつで区切ることは可能ですか?
例えば11223344みたいな文字列があったとして、"11"で変数に格納"22"で変数に格納、みたいな感じです。
11と22と33と44を個別に変数に格納したいんです。
460デフォルトの名無しさん:2006/05/03(水) 20:03:13
strncpy
461459:2006/05/03(水) 20:12:12
strncpyは

  この二つだけを取り出す
.    ↓↓
□□□□□□□□

上の図のように取り出すことは不可能ですよね?
462デフォルトの名無しさん:2006/05/03(水) 20:13:12
何のコンパイラなんだ?>418-421
463デフォルトの名無しさん:2006/05/03(水) 20:14:47
共用体はどうか?
デリミタが無いが、いまどきの文字列操作は範囲指定するそうだからいけるだろう。
464デフォルトの名無しさん:2006/05/03(水) 20:16:26
>>461
main()
{
static char s[] = "abcdefgh";
char u[3];

strncpy(u, s + 3, 2);
puts(u);
}
465459:2006/05/03(水) 20:17:17
>>464
いやすいませんね、助かりましたよ。
466デフォルトの名無しさん:2006/05/03(水) 20:18:20
>461
strncpy(dest,src+ofset,lng)
467デフォルトの名無しさん:2006/05/03(水) 20:21:34
>>465
そんくらいやってみろよ、まったく・・・
468デフォルトの名無しさん:2006/05/03(水) 20:26:55
>465
君はCを使わない方が幸せになれる部類のお人だ
469459:2006/05/03(水) 20:31:47
>>468
ショックなこと言わないで下さいよ
470デフォルトの名無しさん:2006/05/03(水) 20:33:44
俺もそうだ。安心しろ。
471デフォルトの名無しさん:2006/05/03(水) 20:35:14
>467-468
そうは言うが、
&s=s=s[0]を理解するのは結構苦労したぞ>自分の場合
アドレス加算は言われてみればそうだけど、最初気付かないのは誰でも通る道じゃないか?
472デフォルトの名無しさん:2006/05/03(水) 20:37:55
&s=s=&s[0]
473デフォルトの名無しさん:2006/05/03(水) 20:40:22
char[] str
str ~= "nullpo"
474デフォルトの名無しさん:2006/05/03(水) 20:40:35
相変わらずレベル低いなw
475デフォルトの名無しさん:2006/05/03(水) 20:41:36
&s と s は等しくないと思うんだけど。
476デフォルトの名無しさん:2006/05/03(水) 20:41:55
その代入は正しくないのう
477デフォルトの名無しさん:2006/05/03(水) 20:44:36
>>447
おねがいします_| ̄|○

x=x+1
のように漸化式を解いていく過程で前の項と後の項との差を出したい
んですがどうやっても差が出ないんですが・・・
低レベルですいません
478デフォルトの名無しさん:2006/05/03(水) 20:45:28
ポインタで悩むのは誰でも通る道だが、
ポインタを理解せずに文字列操作をするのは危険だ。
479デフォルトの名無しさん:2006/05/03(水) 20:50:59
低レベルでも謝る必要は無いが、
題意がさっぱりわからん。
480デフォルトの名無しさん:2006/05/03(水) 20:51:37
>>477
その場合は、1が差じゃないのか?
x = x + nの形だったら n。
481デフォルトの名無しさん:2006/05/03(水) 20:52:49
>>477
後ろの項はそのまま代入すればいいだろうが、
前の項を求めるには方程式を解かねばならない。
482デフォルトの名無しさん:2006/05/03(水) 20:56:29
頼む、C言語って何なんだ?kwsk頼むwww
Delphiのプラグインだっけ?www
483デフォルトの名無しさん:2006/05/03(水) 20:56:41
>>480
それをプログラムで表示させたいんです。
|x(n+1) - x(n)|
をプログラムで求めたいんです(つд`)
484デフォルトの名無しさん:2006/05/03(水) 20:57:45
int dif(int x){
 x=x+1;
 return x-x;
}
485デフォルトの名無しさん:2006/05/03(水) 20:59:51
>>484
常にゼロだな。美しいソースだ
486デフォルトの名無しさん:2006/05/03(水) 21:04:34
意図がわからんが、
x2 = x + 1;
printf("%d\n", x2 - x);
x = x2;
あえてやろうとしたらこんな感じか?
487デフォルトの名無しさん:2006/05/03(水) 21:09:40
お前ら初心者に嘘を教えて何が嬉しいんだ?

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]);
489デフォルトの名無しさん:2006/05/03(水) 21:10:49
>>484
main関数だけのしかまだやってないので理解が出来ません…
>>486
0になってしまいました…
490デフォルトの名無しさん:2006/05/03(水) 21:24:33
>>487
>ans = x(n+1) - x(n);
のところはどうしたら良いんですか?(゚∀゚)
491デフォルトの名無しさん:2006/05/03(水) 21:32:04
課題をここにコピペ出来ないか?
492403:2006/05/03(水) 21:36:21
そうすると本当にスレ違いになる
493デフォルトの名無しさん:2006/05/03(水) 21:36:57
>>491
x(n+1) = 0.5*[x(n)+(s/x(n))], x(1)=3, s = 9.869004
の漸化式の収束点を|x(n+1)-x(n)|<10-5の精度で求めよ。

ってヤツなんですが自分の考え方がおかしかったですか?(^_^;)
494デフォルトの名無しさん:2006/05/03(水) 21:43:23
n=4ですでに収束してる。<10-5の精度
n<4で問題が発生してるなら、x(n)を整数で扱ってるとか?
495デフォルトの名無しさん:2006/05/03(水) 21:51:27
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)
496デフォルトの名無しさん:2006/05/03(水) 21:54:11
>>493
前の項を求める必要ないじゃん。

プログラミングで収束値を求める場合は、与えられた漸化式が収束値をもつことと
求められた収束値を計算の誤差も含めて上下から 10^(-5) 抑えられることを書いとくと好感度Upだよ。
きっと。
497デフォルトの名無しさん:2006/05/03(水) 21:56:36
アセンブラ使えよ・・・
498デフォルトの名無しさん:2006/05/03(水) 22:02:55
>496
気持ちはわかるが、それでは課題に答えたことにならないから0点。
499デフォルトの名無しさん:2006/05/03(水) 22:04:03
>>496
そうなんですか?!それはすみませんでした(^_^;)
それで、|x(n+1)-x(n)|<10-5になったときに無限ループ
が終わるようにはどうやってすれば良いんでしょうか_| ̄|○
500デフォルトの名無しさん:2006/05/03(水) 22:11:20
>>487
>return &ans;
アドレス参照を返してどうしようと?
返すと同時に(関数終わると同時に)消えるよ、この値。
501デフォルトの名無しさん:2006/05/03(水) 22:15:58
いかにもな釣りだな
502デフォルトの名無しさん:2006/05/03(水) 22:19:03
>>487
どうしてもやるなら、
int* dif(int n) const{

classのメンバ関数にしたほうがいいんじゃないかな。
classの動的オブジェクトはfreeするまで消えないから。
503デフォルトの名無しさん:2006/05/03(水) 22:20:07
>>496
しいて言えば、n=Nで収束と判断した場合、x(N)/(10^-5)が52bitに収まる事は示す必要がある。
504デフォルトの名無しさん:2006/05/03(水) 22:21:05
>>502
藻前はまず、スレタイを1000回ほど朗読した方がいい
505デフォルトの名無しさん:2006/05/03(水) 22:21:20
>>502
おまえうざい
釣りならもっとマシなのやれアフォ
506デフォルトの名無しさん:2006/05/03(水) 22:24:20
>>504
このさい、
extern "Cplusplus"
だっていいだろうw
507デフォルトの名無しさん:2006/05/04(木) 00:08:16
Windows XPでC言語やりたいのですが何から始めればよいのですか?
無料でできるのでしょうか?
508デフォルトの名無しさん:2006/05/04(木) 00:12:47
>>507
マイクロソフトやらボーランドが無料コンパイラを配布してる。
コンソールでいいなら、Cygwinとかも。
ぐぐれば解説は山ほどでてくるんじゃね。
509デフォルトの名無しさん:2006/05/04(木) 00:12:53
>>507
Visual C++ 2005 Express Edition 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1140806916/
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 を使った方がしっくりいく
511507:2006/05/04(木) 00:20:38
>>508->>510
即レスありがとうございます!!
512デフォルトの名無しさん:2006/05/04(木) 00:23:13
そしてVisual C++ 2005 Expressはダークホースかと思われたが、
Windowsプログラミングに当たっては欠けているものが多すぎでスレの勢いは落ちた。

でもCの勉強をする分には十分過ぎる程だよ。
513403:2006/05/04(木) 00:36:59
まず、VMware入れてUbuntu Suse Cent Fedora 当たりをインスコする
gcc 3.3.xから4.x当たりを入れて後は書きたいだけソースかけ
糞Winなんてあと3年したら無くなるから勉強するな意味ない
514デフォルトの名無しさん:2006/05/04(木) 00:38:00
LinuxなんぞCDからブートすりゃいいじゃん
515デフォルトの名無しさん:2006/05/04(木) 00:43:15
>>513
残念ながらたった3年で消えるほど世の中単純ではない。
もちろんWin APIのことだとしてもだ。
516デフォルトの名無しさん:2006/05/04(木) 00:46:12
GCCを使う場合は、-Wallと-pedantic-errorsを忘れないよーに
517デフォルトの名無しさん:2006/05/04(木) 00:59:55
Win32APIよりクライアントサイド.NETのほうが先に消えると思う
518デフォルトの名無しさん:2006/05/04(木) 01:05:45
Win32APIが消える?
その時は、WINDOWSアプリが消えるときだぜ、すなはちWINDOWSが消えるときだ。
VCにとどまらず、VBでも使ってる。
519デフォルトの名無しさん:2006/05/04(木) 01:15:18
>>518
そりゃ.net以前のwinアプリは、全部使ってるがな。
520デフォルトの名無しさん:2006/05/04(木) 01:22:03
>>519
.net使ったことないが、あの「COMのマガイ物」みたいなエタイの知れないものがよく分からん。
どうも話によると、VCとVBとJAVAをつなげれるらしいが、要は開発環境選ばないらしい。
あ、もちろんWIN限定で。
521デフォルトの名無しさん:2006/05/04(木) 03:08:48
関数型マクロがわかりません!
#define MAKEPOINTS(l) (*((POINTS FAR *)&(l)))
このマクロはlの、
上位ビットをy座標としてPOINTS構造体のyに、
下位ビットをx座標として構造体のxにいれて結果を返すみたいです。
ですがなぜそのようになるかわかりません。

これはどのように見たらいいのでしょう?
522デフォルトの名無しさん:2006/05/04(木) 03:13:30
環境依存の話はWindowsプログラミングのスレにどうぞ
523デフォルトの名無しさん:2006/05/04(木) 03:17:37
いやいや、そうじゃなくて別にMAKEPOINTSじゃなくてもいいのよ!
ただ単に今触ってたマクロがこれだっただけで・・・
自分が知りたいのは「関数型マクロ」の書き方なのです。

教えてください、お願いします。
524デフォルトの名無しさん:2006/05/04(木) 07:32:07
>>521
lは上位バイトにy座標、下位バイトにx座標が入っている4バイトの整数型であることを想定している。
POINTSは2バイトのメンバ変数を2つ(x, y)持ち、上のような整数型の変数をPOINTS *型として読むと、
ちょうどx, y座標にぴったり値が当てはまっている。
そのような操作をマクロにまとめたのが、MAKEPOINTS。
525デフォルトの名無しさん:2006/05/04(木) 07:32:40
上位ワードと下位ワードだった、スマン。
526デフォルトの名無しさん:2006/05/04(木) 11:20:00
動的に関数を生成することはできませんか?
JavaScriptなどのクロージャのようなものがあればよいのですが。

var obj = new Object;
var func = function(){ return obj; }
527デフォルトの名無しさん:2006/05/04(木) 11:30:29
>>523
ここであなたが勉強すべきなのはマクロではなくて
キャストの意味です
528デフォルトの名無しさん:2006/05/04(木) 11:31:11
>>526
できません
他の言語を使ってください
529デフォルトの名無しさん:2006/05/04(木) 11:37:24
>>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
}
530デフォルトの名無しさん:2006/05/04(木) 12:24:09
C言語の話?になるかどうか分からないけど
光エレクトロニクス(光素子と仮定し以下参照)

フォトダイオード
フォトトランジスタ
レーザー
発光ダイオード

に関する仕様設定プログラムとかってあります?
光制御プログラミング[Cでの]というイメージなのですが。
プログラミングをどうやるか?じゃなくて存在の有、無と
その例(どのようなに使われているか)が知りたい。
531デフォルトの名無しさん:2006/05/04(木) 12:35:12
どう見てもC言語の話じゃないだろ
「C言語の話かどうか分からない」って頭狂ってるんじゃないのか
532デフォルトの名無しさん:2006/05/04(木) 13:26:36
こっちのほうが意味が分かりやすいかもしれないな
#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デフォルトの名無しさん:2006/05/04(木) 13:29:07
>>532
ニヤ(・∀・)ニヤ
534デフォルトの名無しさん:2006/05/04(木) 13:31:06
>>533
ニヤニヤされちゃった(テヘッ;
OSばればれだね
535デフォルトの名無しさん:2006/05/04(木) 13:38:42
あ、>>532は誤爆です。
失礼しました。
536デフォルトの名無しさん:2006/05/04(木) 15:39:38
久々みたぜ
void main(void)
537デフォルトの名無しさん:2006/05/04(木) 15:41:28
void main()
538デフォルトの名無しさん:2006/05/04(木) 16:07:51
>>536
そんなに嬉しいか
539デフォルトの名無しさん:2006/05/04(木) 17:15:17
>>532
なんでスペース入ってないの?池沼?
540デフォルトの名無しさん:2006/05/04(木) 17:39:49
なんだと!
541デフォルトの名無しさん:2006/05/04(木) 19:31:20
そもそも、電源投入後mainに入り、二度と戻らないようなプログラムの場合
void main(void)だったりする・・・ITRONなどはそうなっている。

まあ、main()がなくても動くけどね。
542デフォルトの名無しさん:2006/05/04(木) 19:38:24
>>541
なってねえよ馬鹿
543デフォルトの名無しさん:2006/05/04(木) 21:01:01
べつにどうでもいいことだと思うが・・・>main
それでどうこうなるわけでもないし。馬鹿みたい。
こんな細かいことにこだわって本質を見抜けない人が多いよね。
544デフォルトの名無しさん:2006/05/04(木) 21:19:05
釣りだと見抜けない>>543
545デフォルトの名無しさん:2006/05/04(木) 21:20:25
bash や make から呼んだ時に困る。
546デフォルトの名無しさん:2006/05/04(木) 21:24:35
本質的に
規格で決まってるのに
どうでもいいって
馬鹿みたい
547デフォルトの名無しさん:2006/05/04(木) 21:26:31
mainの戻り値を使ったことが無い人なんでしょ
548デフォルトの名無しさん:2006/05/04(木) 21:42:54
使ったことないなぁ
とりあえず漠然と正常終了で0、エラーで1だか非負を返してるだけ
549デフォルトの名無しさん:2006/05/04(木) 21:44:19
組み込みプログラムとそうでないのではmainに対する考えが違うのでは?
私は、組み込みで、電源投入後からハードの初期設定やらカーネルの初期処理でタスクの生成や起動
やらの部分を作成してます。

mainについてはNORTiというOSではvoid main(void)という仕様になっています。
550デフォルトの名無しさん:2006/05/04(木) 21:45:05
非負じゃなくて火零でした
551デフォルトの名無しさん:2006/05/04(木) 21:48:33
>>549
そんな事は問題では無い。
mainはintという仕様なのだよ。
552デフォルトの名無しさん:2006/05/04(木) 21:48:42
│ ≡  ('('('('A` )
│≡ 〜( ( ( ( 〜)
↓ ≡  ノノノノ ノ
553デフォルトの名無しさん:2006/05/04(木) 21:56:01
>>551
こいつ void 並の頭の固さじゃね?
554デフォルトの名無しさん:2006/05/04(木) 21:57:36
ということにしたいのですね
555デフォルトの名無しさん:2006/05/04(木) 21:59:55
いやvoidはやわらかいとおもうぞ
と思ったけどやわらかいのはvoid*か
556デフォルトの名無しさん:2006/05/04(木) 22:01:39
C言語の規格では、int main(int, char**); と int main();
を使えることは最低要件となっているが
その他の型のmain関数を定義できてもいいことになっている
557デフォルトの名無しさん:2006/05/04(木) 22:21:54
そもそも組込の開発環境の話をしている相手に対して標準規格ではどうこう言っても(ry
558デフォルトの名無しさん:2006/05/04(木) 22:22:04
int a = 100;

char str = "num = 100";
の100を#defineで一括で置き換えするうまい方法ってないでしょうか
要するに数値とその文字列を一つの#defineで置き換えるという。
559デフォルトの名無しさん:2006/05/04(木) 22:46:44
つ[トークンの文字列化]
560デフォルトの名無しさん:2006/05/04(木) 22:47:56
分からんって事はC FAQ読んでない証拠
11.17辺り。
561デフォルトの名無しさん:2006/05/04(木) 23:01:00
すんません、プリプロセッサのところだけしか見てませんでした
562デフォルトの名無しさん:2006/05/04(木) 23:01:45
>>545
ファームウエアを make から呼んでみろドアホ
563デフォルトの名無しさん:2006/05/04(木) 23:02:49
>>557
言わないでやれよ
(・∀・)ニヤニヤしようぜ
564デフォルトの名無しさん:2006/05/04(木) 23:10:56
>>562はβακα..._φ(゚∀゚ )アヒャ
565デフォルトの名無しさん:2006/05/04(木) 23:29:15
>>564
反論できないことはよーくわかったよ(プ
566デフォルトの名無しさん:2006/05/05(金) 00:40:04
流石GW
567初心者:2006/05/05(金) 02:12:54
もう,かれこれ一週間くらい調べたりしてわからないんですが
datファイルで
1|xxxxx|yyyyy|zzzzz|nnnnn|mmmm
2|xxxxx|yyyyy|zzzzz|nnnnn|mmmm
:
:
のように書いたものがあるんですが
そのファイルから
1|yyyyy|nnnnn|
:
:
のようなものを作りたいのですが
こういった場合,何をどういう風に使えばいいのでしょう.
教えてください,よろしくお願いします.
568デフォルトの名無しさん:2006/05/05(金) 02:24:27
これでOK

int i;
for (i=1; i<100; ++i) {
 printf("%d|yyyyy|nnnnn|\n", i);
}
569デフォルトの名無しさん:2006/05/05(金) 02:36:40
>>567
cut -d '|' -f 2,4
570デフォルトの名無しさん:2006/05/05(金) 02:49:30
>>569
cut -d '|' -f 1,3,5
571デフォルトの名無しさん:2006/05/05(金) 04:49:19
strtok()
572デフォルトの名無しさん:2006/05/05(金) 04:50:40
sscanf()
573デフォルトの名無しさん:2006/05/05(金) 08:07:26
>>567
select yyyyy, nnnnn from dat
574デフォルトの名無しさん:2006/05/05(金) 10:11:23
gawk '{ print $1, $3, $5 }'
575初心者:2006/05/05(金) 10:16:27
みなさん、ありがとうございます!
試してやってみます!
その後報告させていただきます。
576デフォルトの名無しさん:2006/05/05(金) 11:18:40
ホントかよ
577デフォルトの名無しさん:2006/05/05(金) 12:59:26
マジレスするとfgets()なりで一行読み込んだあとstrtok()で区切り文字を|にして分離して変数に読み込んだ後fprintf()で出力。
578デフォルトの名無しさん:2006/05/05(金) 14:10:05
strtok()って最近は問題ないの?
579デフォルトの名無しさん:2006/05/05(金) 14:20:35
>>578
今も昔も静的領域を利用することに変わりはないから要注意であることには変わらないよ。
#勿論スレッドアンセーフだし。
580デフォルトの名無しさん:2006/05/05(金) 14:25:18
>>579
最近いろいろな所でstrtok()見かけるようになったから仕様が変わったのかと
思ってたら、変わってなかったのね… (((( ;゜Д゜)))ガクガクブルブル ((((
581デフォルトの名無しさん:2006/05/05(金) 14:31:44
あの言語仕様だと変えようがないだろ
582デフォルトの名無しさん:2006/05/05(金) 15:56:30
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行ですむが
586403:2006/05/05(金) 16:25:34
strjpok(?)使えばいいのか
587デフォルトの名無しさん:2006/05/05(金) 16:27:58
VC 2005 では危険な関数に関して
安全にした別の関数を独自に用意してたような。
588デフォルトの名無しさん:2006/05/05(金) 19:25:09
関数について
void test(int hoge[]);

void test(int *hoge);
は同じ?
589デフォルトの名無しさん:2006/05/05(金) 19:36:37
うん
590デフォルトの名無しさん:2006/05/05(金) 19:41:26
>>588 同じ

int a[2];
1[a]=2;

でもOK
591デフォルトの名無しさん:2006/05/05(金) 19:42:57
>>590
それとこれとどういう関係が。
592デフォルトの名無しさん:2006/05/05(金) 20:00:26
cの配列はポインタの略記法という意味
593デフォルトの名無しさん:2006/05/05(金) 20:11:21
小さな言葉のアヤが致命的な誤解へとつながっていく >「角括弧」と「配列」
594デフォルトの名無しさん:2006/05/05(金) 20:59:33
>>590
void test(int hoge[16]);

void test(int *hoge);
は同じ?
595デフォルトの名無しさん:2006/05/05(金) 21:05:13
>>594
違う
596デフォルトの名無しさん:2006/05/05(金) 21:06:45
>>594
同じ。
597デフォルトの名無しさん:2006/05/05(金) 21:14:36
ワーニングが出る
598デフォルトの名無しさん:2006/05/05(金) 21:34:58
>>594
違う
599デフォルトの名無しさん:2006/05/05(金) 21:36:03
>>594
同じ。
600デフォルトの名無しさん:2006/05/05(金) 21:39:34
違う
601594:2006/05/05(金) 21:46:43
602デフォルトの名無しさん:2006/05/05(金) 22:07:56
>>592
型における [] や * と
式における [] や * は
全く別物だ。
603デフォルトの名無しさん:2006/05/05(金) 22:17:54
>>587
Safer C(Secure Cだっけ?)のフライングみたいなヤツでしょ?
604デフォルトの名無しさん:2006/05/05(金) 22:25:44
>>602
同じ
605デフォルトの名無しさん:2006/05/05(金) 23:16:25
>>604
違うよw
606デフォルトの名無しさん:2006/05/05(金) 23:51:42
どっちだ!
607デフォルトの名無しさん:2006/05/06(土) 00:13:03
あさっての方角だ。
608デフォルトの名無しさん:2006/05/06(土) 05:38:03
str[i] == *((str) + (i))
609デフォルトの名無しさん:2006/05/06(土) 09:38:41
>>590(=>>592?)
勉強し直した方がいいよ。


・関数の仮引数中における最外の[]は*と等価

と言うのと

・a[1] は *(a+1) のシンタックス・シュガーである

と言うのは、全くの別物。
610デフォルトの名無しさん:2006/05/06(土) 09:56:43
コンテキストによってトークンの意味がかわってしまうのは
Cのうんこな欠点のひとつ
staticとか
611デフォルトの名無しさん:2006/05/06(土) 12:25:24
perlなんざ七色変化ですがな。
612デフォルトの名無しさん:2006/05/06(土) 13:36:50
それは欠点じゃない。
無駄にキーワードや演算子が多い方がむしろ良くない。
これは言語設計の1つの指針だ。

それに、>>609 はトークンの意味が変わるという程は
意味は変わってない。違うのは確かだが。
別な文法にした方がむしろ混乱する。
613デフォルトの名無しさん:2006/05/06(土) 13:50:32
> ・a[1] は *(a+1) のシンタックス・シュガーである

シンタックスシュガーじゃないだろ。
614デフォルトの名無しさん:2006/05/06(土) 14:02:20
>>613
シンタックスシュガーだよw
a[b] は *(a+b) のシンタックスシュガーだ。

*(a+1) は a[1] とも 1[a] とも書けるからやってみそ。
615デフォルトの名無しさん:2006/05/06(土) 16:39:42
但し、a, bいずれかがポインタであり、残りが整数型に変換可能である必要はある。
616デフォルトの名無しさん:2006/05/06(土) 16:47:10
C言語の、初心者にも分かる一番良い参考書って何?
617デフォルトの名無しさん:2006/05/06(土) 16:52:55
古いといわれるかも知れんが、
K&Rを薦めたい。
ANSIと違うが、たいていのコンパイラは対応しているから気にするな。
GUIは"猫でも"で並行学習だ。
618デフォルトの名無しさん:2006/05/06(土) 16:58:23
自動変数を関数の戻り値にしてはいけないとよく言われますが
構造体を返しても大丈夫ですよね?
619デフォルトの名無しさん:2006/05/06(土) 16:59:08
ありがとうございました。
620デフォルトの名無しさん:2006/05/06(土) 17:00:15
>>617
GUIってWinのこと?
621デフォルトの名無しさん:2006/05/06(土) 17:10:22
CもC++もWinAPIもGUIもクソ味噌にしてる奴が多いな
622デフォルトの名無しさん:2006/05/06(土) 17:11:07
>>615
まあ、それは *(a+b) でも一緒だし。
623デフォルトの名無しさん:2006/05/06(土) 17:12:03
CUIではつまらないだろう?
ただ、GUIにはイベントドリブンという壁があるな。
こいつは新言語を習得するのと同じくらいクセモノだ。
624デフォルトの名無しさん:2006/05/06(土) 17:15:48
俺だったらWinプログラミングじゃなくてUNIXプログラミングを薦める

もしくはJava
625デフォルトの名無しさん:2006/05/06(土) 17:29:54
薦めるのはいいがスレ違いになると教えておけよ
ここは聞くほうも答えるほうもC以外に傾きやすい
626デフォルトの名無しさん:2006/05/06(土) 17:38:22
>>614
「シンッタクスシュガー」の意味わかってんのかよ。
627デフォルトの名無しさん:2006/05/06(土) 17:43:39
>>618
効率云々の話は別にして、構造体を返してもOK
628デフォルトの名無しさん:2006/05/06(土) 17:49:48
>>626
おれは614じゃないけど
糖衣構文のことだろ、問題ない
629デフォルトの名無しさん:2006/05/06(土) 18:00:49
>>618
つーか、自動変数を返すこと自体は全く問題ない。
問題なのは、自動変数のポインタを返すことだ。

間違いやすい点としては、配列を返すことはできないので配列を返す積もりでポインタを返すケースだな。
630デフォルトの名無しさん:2006/05/06(土) 18:34:20
今C言語の勉強してるのだが、数年前の古い参考書を元に
勉強しているので、gotoとか出てきます。
gotoって確か廃止された命令だと風の噂で聞いたんですが、
勉強する必要って有るのですか?
631デフォルトの名無しさん:2006/05/06(土) 18:37:32
>>630
使えれば便利なこともある。
でも後藤さんがあまり人気が無いのは確かだ
632デフォルトの名無しさん:2006/05/06(土) 18:37:53
真のC使いはgotoを恐れたりはしない。
633デフォルトの名無しさん:2006/05/06(土) 18:40:04
>>630
昔も今も廃止されてはいないが、一般的には非推奨。
gotoを説明している項目以外でgotoを頻繁に使っているのなら、
その本を読むのは考え直すべき。
634デフォルトの名無しさん:2006/05/06(土) 18:40:26
インクルードファイル<stdio.h>がオープンできない
っていうエラーはどう解決したらいい?
ほとんどCを知らない初心者でスマソ
635デフォルトの名無しさん:2006/05/06(土) 18:41:50
>>634
もう一回インストールし直す。俺も昔それがあってちょっとあせった
636デフォルトの名無しさん:2006/05/06(土) 18:44:22
ソースと同じ場所に置いて
#include "stdio.h"
とする。
637デフォルトの名無しさん:2006/05/06(土) 18:48:34
インストールしなおすって何を?
638デフォルトの名無しさん:2006/05/06(土) 18:50:18
頭の中を
639デフォルトの名無しさん:2006/05/06(土) 18:51:06
>>637
コンパイラ
640デフォルトの名無しさん:2006/05/06(土) 18:54:47
スタジオを
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)です。

デバッカで追っている間は、意図したように文字列が
作成さているようです。
643デフォルトの名無しさん:2006/05/06(土) 19:01:25
水をさして悪いがflexとかを使った方が・・・
644デフォルトの名無しさん:2006/05/06(土) 19:01:35
そのchar * cは気になるな〜
645デフォルトの名無しさん:2006/05/06(土) 19:02:41
構文を調べてから使いなされ<realloc()
646デフォルトの名無しさん:2006/05/06(土) 19:02:57
>>641
ソースを見ていないから何とも言えんが、
最初のポインタ変数を、ちゃんと NULL とかで
初期化していないんじゃないのか?

まず realloc の使い方をしっかり調べとけ。
647デフォルトの名無しさん:2006/05/06(土) 19:06:24
>>643
お気遣い恐れ入ります。
しかしなんというか、自分で作ってみたいんですよ。
C言語面白くて。
正直、とりあえずゲームは二の次って感じなんです。

>>646
レスありがとう。
初期化はしています。
デバッカでも直前はNULLになっています。
648デフォルトの名無しさん:2006/05/06(土) 19:07:20
ちゃんとrealloc()の戻り値を使用しているか?
649デフォルトの名無しさん:2006/05/06(土) 19:10:51
で、そのポインタを realloc に渡しているか?
realloc の戻り値ををちゃんと再設定しているか?
650デフォルトの名無しさん:2006/05/06(土) 19:13:49
c = (char *)realloc(c, newlength)
651デフォルトの名無しさん:2006/05/06(土) 19:16:07
>>648
使用していませんでした。ごめんなさい。
あなたのレスとC言語辞典をよく見かえしたらなんか理由が分かったような。
ちょっとやってみます。ありがとう。
652デフォルトの名無しさん:2006/05/06(土) 19:16:42
char* c について
最初はNULLまたは正規の関数で取得したアドレス。
途中は非NULLチェック必須。
653デフォルトの名無しさん:2006/05/06(土) 19:17:13
GUIの質問はここでよろしいですか?
654デフォルトの名無しさん:2006/05/06(土) 19:22:43
いまどきは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です。
656デフォルトの名無しさん:2006/05/06(土) 19:34:17
LPCTSTR szStr = _T("hello, world");

にしてみ。
657デフォルトの名無しさん:2006/05/06(土) 19:36:58
>>656
_T識別子が見つかりませんでしたってエラーが出て来ました。そうすればいいのでしょうか?
658デフォルトの名無しさん:2006/05/06(土) 19:47:19
変なところは無いが・・
メッセージループ前後を省略しているが、ここ以外におかしいところが有ると思う。
659デフォルトの名無しさん:2006/05/06(土) 19:50:20
>>658
とりあえず全部うpしてみました
http://www.uploda.org/uporg382913.c.html
お願いします
660デフォルトの名無しさん:2006/05/06(土) 19:52:17
#include <tchar.h>
661デフォルトの名無しさん:2006/05/06(土) 19:54:13
>>660
ありがとうございます。
出来ました。
お答えいただいたかたがた本当にありがとうございました
662デフォルトの名無しさん:2006/05/06(土) 20:00:43
http://pc8.2ch.net/test/read.cgi/tech/1144387445/l50
だからジェネリックテキストなんて使うなって言ってたのに。
663641:2006/05/06(土) 20:09:50
641です。
解決しました。
勢いで書いたところを中心にもう一度よぉぉく見返したら
明らかなメモリ破壊コードを書いてました。
くだらないオチで本当にお恥ずかしい。
今回はreallocの使い方が直接の原因ではなかったけれど、
それも十分危険なコードであると知りました。
レス下さった方ごめんなさい。そしてありがとうございました。
664デフォルトの名無しさん:2006/05/06(土) 20:38:34
>>630
gotoを勉強する必要があるようなら、先は長いな。
665デフォルトの名無しさん:2006/05/06(土) 20:47:53
学ぶ必要も何も5分で覚えられると思うが・・・
使うかどうかは別として
666デフォルトの名無しさん:2006/05/06(土) 20:50:18
gotoを勉強する必要が無いようなら、先は短いな。
667デフォルトの名無しさん:2006/05/06(土) 20:51:33
でも後藤さんって形としてはすっきりした形で終わらせてくれるよね。でも俺は後藤さんは嫌い
668デフォルトの名無しさん:2006/05/06(土) 20:52:03
longjumpしかつかっちゃいけない
うちの環境なんとかしてほしい
669デフォルトの名無しさん:2006/05/06(土) 20:59:46
ポインタについて質問です。

A. ポインタという一種入れ物があって、その中に何かを代入できる
B. ポインタとはメモリに貼り付けるラベルのようなもので、入れ物ではない

今までずっとAが正しいと思っていたのですが、最近になってBかもしれないと思うようになりました。
前者の場合、ポインタの中に何を入れようとも(ポインタが空であろうとも)
ポインタ自身がメモリの中の一定位置に存在することになり、
後者の場合はポインタの指し示すアドレスによってポインタの位置もコロコロ変わる様なイメージです。

B であってますでしょうか?
670デフォルトの名無しさん:2006/05/06(土) 21:04:33
>>669
どっちも違うような・・・
>ポインタ自身がメモリの中の一定位置に存在することになり
存在してますよ、
>指し示すアドレスによってポインタの位置もコロコロ変わる
それはないですよ
671デフォルトの名無しさん:2006/05/06(土) 21:05:57
>>669
ポインタ変数という一種入れ物があって、
その中にポインタを代入できる 
672デフォルトの名無しさん:2006/05/06(土) 21:12:48
goto ポインタ
という手法は最近一部で流行っている。
673デフォルトの名無しさん:2006/05/06(土) 21:19:22
アセンブラとかやってない世代は、ポインタについてどうやって理解していくべきだと思う?

普通は、C言語を使っているうちにだんだんと慣れていって、実感が湧いてくるもんだよなあ?
674デフォルトの名無しさん:2006/05/06(土) 21:24:24
アセンブラやればいいじゃん。
インラインアセンブラでいいから。
675デフォルトの名無しさん:2006/05/06(土) 21:27:11
アセンブラでなくとも、ポインタは自然と身につく。

たとえば、BASICでもポインタの概念は必須だった。
F-BASIC限定だが、文字列変数名=文字列の先頭アドレス
その他のMS系BASICでも、変数のアドレスを得る関数は有った。

どんな言語でも、データのアドレスという概念無しで
出来ることはたかが知れている。
676デフォルトの名無しさん:2006/05/06(土) 21:47:22
>>669
AかBかと聞かれれば俺はAにするな。
677デフォルトの名無しさん:2006/05/06(土) 21:47:57
>>656
TEXT("hello, world")
678デフォルトの名無しさん:2006/05/06(土) 21:52:30
>>669
どちらでもない。

ポインタとは、プログラム中に使用するオブジェクトを指し示す値の事。
679デフォルトの名無しさん:2006/05/06(土) 22:04:35
>>673
メモリダンプとかやってみれば?
680デフォルトの名無しさん:2006/05/06(土) 22:21:42
規格では「ポインタ」はどう定義されてるの?
681デフォルトの名無しさん:2006/05/06(土) 22:26:04
後藤ポイントのテクニック書いたページってどこだっけ?
682デフォルトの名無しさん:2006/05/06(土) 23:20:27
質問ですが。
C言語覚えるとどんないいことがありますか。
ハッキングできんの?
683デフォルトの名無しさん:2006/05/06(土) 23:25:27
ポインタ != アドレス
なわけだが、たいていの実装は
ポインタ == アドレス
684デフォルトの名無しさん:2006/05/06(土) 23:25:27
>>C言語覚えるとどんないいことがありますか。
何も無い
しいて言えば、Cを使いたい時にCが使えるだけ
>>ハッキングできんの?
努力次第(Cに限った事ではない)
685デフォルトの名無しさん:2006/05/06(土) 23:27:57
>>683
実装の段階で
ポインタ != アドレス
って、どんな時?
686デフォルトの名無しさん:2006/05/07(日) 00:00:28
型と値の違いもわからないアフォがいるづら
687デフォルトの名無しさん:2006/05/07(日) 00:02:05
>>685
JAVAとかのへんな糞思想入って
ごっちゃになってるだけじゃね?
688683:2006/05/07(日) 00:28:34
書き方が悪かったか
でもまぁいいやアホの戯言はスルーしてくれ
689sage:2006/05/07(日) 00:42:17
すいません。
swith文で、 \ を判定するには、どうすればよいのでしょう?
以下のように書いたのですが、うまくいきません。

switch( *ss ){
case '\\';
...
}
690デフォルトの名無しさん:2006/05/07(日) 00:43:04
case '\\':
691689:2006/05/07(日) 00:45:44
>690

すいません。
';'は':'のタイプミスです。
なお、コンパイルしてもエラーは発生していません。
692デフォルトの名無しさん:2006/05/07(日) 00:53:03
>>689
それだけ見ても、どう巧くいっていないのか判らない。
もう少しはっきりと判るコードの断片か状況説明をしてくれ。
#まさかbreak;してないって落ちじゃないだろうなぁ。
693デフォルトの名無しさん:2006/05/07(日) 00:54:01
コード一行も変更せず載せろよ
話はそれからだ
694デフォルトの名無しさん:2006/05/07(日) 00:55:25
typedef WCHAR TCHAR , *PTCHAR ;
このカンマの意味何?
695デフォルトの名無しさん:2006/05/07(日) 00:57:18
同時に宣言してるだけ
typedef WCHAR TCHAR;
typedef WCHAR *PTCHAR;
と同じ
696デフォルトの名無しさん:2006/05/07(日) 00:58:01
int a, b;
このカンマと同じ。
697694:2006/05/07(日) 00:58:25
どうもありがとう
698デフォルトの名無しさん:2006/05/07(日) 01:01:55
>>689
#include <stdio.h>
main(){
char a = '\\';
switch(a){
case '\\': puts("This is \\.");
}
}
これで
This is \.
と表示される

うまくいかないのは別の部分にあるはず
699689: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;
}
}
700デフォルトの名無しさん:2006/05/07(日) 01:15:39
単に
case '\n':
で改行取れるんちゃうん?
'\n'で一文字。
701689:2006/05/07(日) 01:16:20
すみません、自己解決しました。
関数に渡している引数が悪かったです。

'\n'って、'\'と'n'の2文字として扱われるんじゃないんですね。
勉強不足でした。
702デフォルトの名無しさん:2006/05/07(日) 01:17:45
>>701
> '\n'って、'\'と'n'の2文字として扱われるんじゃないんですね。
うむ
\nってのはあくまでも改行をソース中に記述するための記号
703689:2006/05/07(日) 01:23:37
すみません、自己解決しました。
関数に渡している引数が悪かったです。

'\n'って、'\'と'n'の2文字として扱われるんじゃないんですね。
勉強不足でした。
704689: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)
{
}

みたいなコードって途中で止まっちゃわないでしょうか?
707デフォルトの名無しさん:2006/05/07(日) 17:31:56
fgetc() は、 stream から次の文字を unsigned char として読み、 int にキャストして返す。ファイルの終わりやエラーとなった場合は EOF を返す。
708デフォルトの名無しさん:2006/05/07(日) 17:33:29
charとintが同じサイズの環境だとどうなるんだろう。
とふと思った。
709デフォルトの名無しさん:2006/05/07(日) 17:39:04
1回目は'-'に相当する0x2Dを返す
2回目は'1'に該当する0x21を返す
俺釣られたんだよね?
710デフォルトの名無しさん:2006/05/07(日) 17:40:20
>>708
charは1byteだし
intは最低2byteじゃなかったっけ?
711デフォルトの名無しさん:2006/05/07(日) 17:40:31
>>707
なるほどです。ありがとうございます。

712デフォルトの名無しさん:2006/05/07(日) 17:41:35
>>709
釣ってるのは君のほう。
713デフォルトの名無しさん:2006/05/07(日) 17:44:06
>>710
intは最低16ビット。

で、
sizeof char == 1
sizeof int == 1
CHAR_BIT == 16
なんつー環境があるんだが、こういう場合はどうする?
714デフォルトの名無しさん:2006/05/07(日) 17:46:12
環境が分かってるのならEOFがどうなってんのか見てみる。
715デフォルトの名無しさん:2006/05/07(日) 17:49:43
>>714
今家だから確かなことはわからんけど、多分そんなもんないと思う。
で、もしそういう環境でCの標準環境を整えるならどうやるのか疑問に思っただけ。
716デフォルトの名無しさん:2006/05/07(日) 17:54:22
char_bitが16ならそのまま返せばいいんじゃね?
ASCII文字は1byteに収まるわけだし
717デフォルトの名無しさん:2006/05/07(日) 18:06:55
多分まともなCを作るなら>>713みたいな定義を
しちゃいけないような気がする。
8ビットアクセスに手間が掛かるとしても、
CHAR_BIT==8にしておくべきなんじゃないか。
718デフォルトの名無しさん:2006/05/07(日) 18:07:32
>>716
getc()はASCII文字を返すって決まってるの?
719デフォルトの名無しさん:2006/05/07(日) 18:12:12
UTF-32を返す場合もあるよ
720デフォルトの名無しさん:2006/05/07(日) 18:22:49
>>713みたいな定義をするなら
なんか1文字削ってEOFに割り当てるくらいかなぁ
ファイルの途中にEOFにあたるものが使われてたらエラー扱いで。
721デフォルトの名無しさん:2006/05/07(日) 18:30:31
バイナリモードのときどうする?
そう考えるとsizeof (int) == sizeof (char)はありえないな。
722デフォルトの名無しさん:2006/05/07(日) 18:31:07
723デフォルトの名無しさん:2006/05/07(日) 18:41:45
>>717
現に定義はそうなってるし、CHAR_BITが8以上の環境も存在する。
724デフォルトの名無しさん:2006/05/07(日) 18:45:28
>>723
たとえば?
CHAR_BITが16の環境ってintが32なんじゃね?
725デフォルトの名無しさん:2006/05/07(日) 18:45:59
>>715
標準に準拠したコンパイラ導入すればいいだけでは?
726デフォルトの名無しさん:2006/05/07(日) 18:50:45
char,short,int,longが全部32bitの環境もあるらしいよ。
727デフォルトの名無しさん:2006/05/07(日) 19:18:14
>>723
CHAR_BITが8じゃないのはこの際どうでもよくて、
intとcharのサイズが一緒ってどうよって話。

CHAR_BITを出したのは、>>710みたいな突込みがあるから。
>>710は間違ってたけど。
728デフォルトの名無しさん:2006/05/07(日) 19:19:52
>>726
EOFはどうなってるの?
729デフォルトの名無しさん:2006/05/07(日) 19:52:12
0〜255の256種類の数値を返す訳だから、sizeof char==sizeof intでも問題ない。
730デフォルトの名無しさん:2006/05/07(日) 20:03:26
要は、0-255と-1が表せればいいわけだね。

>>706
そういうわけで、fgetc()の戻り値はintになっている。
731デフォルトの名無しさん:2006/05/07(日) 20:15:19
>>730 , all
どうなるかはらはらしていました。
ありがとうございます。
安心してintを使います。
732デフォルトの名無しさん:2006/05/07(日) 20:20:06
C言語標準では、sizeof(char)は、1にならなければならい
733デフォルトの名無しさん:2006/05/07(日) 20:23:19
いやだから
sizeof(char)=1=8bit
とは限らないと・・・

もういいか
734デフォルトの名無しさん:2006/05/07(日) 20:24:35
>>732
みんなそんなことわかってる
735デフォルトの名無しさん:2006/05/07(日) 20:33:16
はい、次の質問どーぞー
736デフォルトの名無しさん:2006/05/07(日) 20:50:07
領域確保の実験をしているのですが、
#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
738デフォルトの名無しさん:2006/05/07(日) 20:51:45
>>705
マクローリン展開は無限級数だから何か条件が与えられているはず。
課題の一部を省略されると答えようが無いよ。
>>722
マクローリン展開はおまけで、sin()の高速化が主題だから>>705は読み解くのに苦労すると思われ。
739デフォルトの名無しさん:2006/05/07(日) 20:55:34
#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です
740デフォルトの名無しさん:2006/05/07(日) 20:57:58
printf("%s", moji[9]);
741デフォルトの名無しさん:2006/05/07(日) 20:58:29
>>736
すべて '\0' でクリアされた領域を指すポインタ p の
内容を表示させたらカラの文字列で正しい結果だ。
つか、iostream.h なんか include してやがる、とか
そもそもそれ C++ じゃん、とかも含めて
うまくいってないのは君の頭の働きが悪い所為。

>>739
書式に "%s" を指定しておきながら moji[i] を渡しているが
結局何がしたいんだ?
742デフォルトの名無しさん:2006/05/07(日) 21:00:09
%sにはアドレスを渡さないといかん
743デフォルトの名無しさん:2006/05/07(日) 21:01:20
>>739
%sを%cにすればいいと思うよ。でも僕初心者だからわかりません
744デフォルトの名無しさん:2006/05/07(日) 21:10:18
>>739 moji[9] に何が入っていると思う?
745デフォルトの名無しさん:2006/05/07(日) 21:10:40
ぬるぽ
746デフォルトの名無しさん:2006/05/07(日) 21:18:27
>>745
ガッ(AA略)
747デフォルトの名無しさん:2006/05/07(日) 21:24:16
>>740-743
ありがとう

そしたら
[0]の中身はabcdefghi
[1]の中身はbcdefghi
[2]の中身はcdefghi
[3]の中身はdefghi
[4]の中身はefghi
[5]の中身はfghi
[6]の中身はghi
[7]の中身はhi
[8]の中身はi
[9]の中身は
となります、配列一つ一つに格納されるのではないでしょうか?
748デフォルトの名無しさん:2006/05/07(日) 21:26:42
? "%c"かその出力 >747
749デフォルトの名無しさん:2006/05/07(日) 21:26:45
moji[9]がnulなのは幸運のしるし。
750デフォルトの名無しさん:2006/05/07(日) 21:27:40
>>747
printfの変換指定子を%sから%cにしろと言ってるだろ
751デフォルトの名無しさん:2006/05/07(日) 21:35:17
752デフォルトの名無しさん:2006/05/07(日) 21:37:52
>>747

%s、は文字列を返す変換指定子
文字列とはこの場合、moji[i]から次の'\0'の現れる場所まで。
今回はたまたまmoji[9]が'\0'だったようだから、
例えば、i=0、の時にmoji[0]からmoji[9]までを表示する形になった。
もしも、moji[i]だけを表示したいのなら、
は文字を返す変換指定子、%c、を使わないといけない。

と皆様方はおっしゃっているのではないかと、素人ながら思うわけです。
753デフォルトの名無しさん:2006/05/07(日) 21:39:43
>>752
素人ナカーマ( ´∀`)/\(´∀` )/
754デフォルトの名無しさん:2006/05/07(日) 21:45:04
>>748,750
for(i=0;i<=9;i++){
printf("[%d]の中身は%c\n",i,&moji[i]);
}
にしました。すみません
[0]の中身は
[1]の中身は・
中略
[9]の中身は・
になります

>>749
それは気をつけました
755デフォルトの名無しさん:2006/05/07(日) 21:47:33
>文字列を返す変換指定子
>文字を返す変換指定子

ここの表現に引っかかるものを感じるのであります
"返す"ってどゆ事?
"〜と解釈して変換汁"と指定って事でそ?
756デフォルトの名無しさん:2006/05/07(日) 21:49:10
>>754
moji[i]にアンパサンドいらない
757デフォルトの名無しさん:2006/05/07(日) 21:49:34
%c
&moji[i]

ってw
758デフォルトの名無しさん:2006/05/07(日) 21:49:55
printf("[%d]の中身は%c\n",i,moji[i]);
じゃ無いの?レス読んで無いからよくわからんけど。
759デフォルトの名無しさん:2006/05/07(日) 21:50:35
>>754
お前は工房の俺より出来ないな
760デフォルトの名無しさん:2006/05/07(日) 21:52:27
気にするな。
最初はみんなこんなもん。
761デフォルトの名無しさん:2006/05/07(日) 21:58:23
>>756-758
出来ました!ありがとうございます。

moji[i]でアドレスが渡るんですか?(その様だけど)
762デフォルトの名無しさん:2006/05/07(日) 21:59:54
>>761
ちょっと違う。
mojiにmoji[0]のアドレスが格納されている。
moji=moji[0]って漢字かな
763デフォルトの名無しさん:2006/05/07(日) 22:01:53
>762
ちょっと違う
764デフォルトの名無しさん:2006/05/07(日) 22:02:59
char moji[10]={'a','b','c','d','e','f','g','h','i'};
のときの moji[9] って C の規格としては未定じゃないの?
765デフォルトの名無しさん:2006/05/07(日) 22:07:27
>>764
0が入るんじゃね?
766デフォルトの名無しさん:2006/05/07(日) 22:08:11
>>764
0
767デフォルトの名無しさん:2006/05/07(日) 22:12:26
>765-766
知らんカッタ。サンクス。
768デフォルトの名無しさん:2006/05/07(日) 22:16:23
配列の初期化では、初期化の足りない要素は 0 で初期化されます

だってさ

ちなみに昔の C 言語では構造体や配列をあらかじめ初期化するには、始めの要素からすべて指定して初期化する方法しかありませんでしたが
指示付きの初期化子は初期化時に配列の要素やメンバ名を指定することで、わかりやすく初期化を行えるようにする
例えば、配列の 3 番目の要素を初期化したい時には、 [3] = ..., というように記述します。また構造体や共用体を初期化したい時には、.メンバ名 = ..., のように指定することで初期化を行えます。

769デフォルトの名無しさん:2006/05/07(日) 22:26:04
独習C読んでるんだけど250ページあたりで挫折しそう。(特に文字配列を使ったところがいまだ理解できてないっぽい自分が・・・)
なんかもっと入門用のお勧め本教えて
770デフォルトの名無しさん:2006/05/07(日) 22:26:38
絵本
771デフォルトの名無しさん:2006/05/07(日) 22:29:30
>>769
はじめてのCでも読んどけ

電車の中だとちょっとアレだがな
772デフォルトの名無しさん:2006/05/07(日) 22:34:13
よく考えてみたらすれ違いだった
>>771初めてのCはなんとなく読んだ
とりあえず何度も読んで理解しようと思ふ
773デフォルトの名無しさん:2006/05/07(日) 22:40:21
条件式を
((a==99 && b==88) || (c==55 && d==44))
にするか、
(a==99 && b==88 || c==55 && d==44)
にするかで、どういった違いが出るんですか?
プログラムの動作上は変わりないですよね? 変わるとしたらコンパイル速度ですか?
774デフォルトの名無しさん:2006/05/07(日) 22:43:37
C言語の入門書としてこれまで見た本の中で最高。
この本を見ていると、「どうして『ポインタ』が『Cの壁』になんかなるんだろう?」と思ってしまうほど。
775デフォルトの名無しさん:2006/05/07(日) 22:44:29
>>773
読みやすさ。

演算子の優先順位は、おぼえるの大変だから、カッコはつけたほうがいい。
(四則演算でもつけたほうがいいって書いてある本もあるくらい)
776デフォルトの名無しさん:2006/05/07(日) 22:44:33
>>773
見易さ。
777デフォルトの名無しさん:2006/05/07(日) 22:44:44
>>773
一番の違いは見た目。
前者のほうがわかりやすいと言う意見もそれなりにある。
778デフォルトの名無しさん:2006/05/07(日) 22:44:46
>変わるとしたらコンパイル速度ですか?
ソース読んだ人の理解する速度
779デフォルトの名無しさん:2006/05/07(日) 23:53:31
配列 char str[256]; があった場合なんですが、添字を指定しない場合は
先頭要素の最初のアドレス &str[0] と等価ですが、添字を指定せずに
アドレス演算子を使った &str はどういう扱いになりますか?
printf でアドレスを表示させてみたところ、同じところを指してましたが、
処理系依存でたまたまなのか、そういうものなのか、分かりませんでした。
780デフォルトの名無しさん:2006/05/07(日) 23:54:11
そういうものです
781デフォルトの名無しさん:2006/05/08(月) 00:19:10
型が違うんだけど
同じところを指す
782デフォルトの名無しさん:2006/05/08(月) 00:19:51
>>780
わずか40秒のレス、ありがとうございます。そういうものなんですね。
ネットで調べても、配列の場合は & は必要ありません、ばかりで
&を付けた場合の説明を見つけられなかったので…。
783デフォルトの名無しさん:2006/05/08(月) 00:26:18
>>773
コンパイラにもよるが意味による最適化は行わないかもしれないから
(a==99 && b==88 || c==55 && d==44) ではなくて評価回数が多いのであれば
(c==55 && d==44 || a==99 && b==88) 括弧とかは演算子の優先順位を保証するためだから
つけたかったら付ければいい
784デフォルトの名無しさん:2006/05/08(月) 00:26:20
>>782
781も書いてるけどまったく同じってわけじゃないですよ
785デフォルトの名無しさん:2006/05/08(月) 00:29:39
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);
}
786デフォルトの名無しさん:2006/05/08(月) 00:30:54
>>782
配列へのポインタが必要な場合は、配列にアンパサンドをつける必要があります。
通常、そういう使い方の説明をする人はいないから配列にアンパサンドをつける必要がないという書き方になるのでしょう。
#要は、>781なので使い道がないわけではない。
787デフォルトの名無しさん:2006/05/08(月) 00:43:30
>>781
書き込み前にリロードしてませんでした。すみません。型が違うんですね。
今まで、scanf で &str でもうまく動いてしまっていたので、偶然なのか、
疑問に思ってました。781を読みましてchar*型への代入で試してみましたら
 間接参照のレベルが 'char *' と 'char (*__w64 )[256]'で異なっています。
の警告がでました。配列のポインタ(?)になるんですね。

>>785
試してみました。
指しているアドレスは一緒でも、型が違うのでポインタ演算の結果が異なるんですね。

>>786
配列へのポインタとのことで…疑問が解けてすっきりしました。

疑問を晴らすことが出来ました。勉強になりました。ありがとうございました。
788デフォルトの名無しさん:2006/05/08(月) 01:11:21
>>768
>指示付きの初期化子は
C99以降、な。

>>775
>演算子の優先順位は、おぼえるの大変だから、カッコはつけたほうがいい。
程度問題。&& と || くらい覚えとけ、って気が個人的にはしなくもない。が、
>(四則演算でもつけたほうがいいって書いてある本もあるくらい)
どこの小学生向けの本だ。
789デフォルトの名無しさん:2006/05/08(月) 02:30:34
ビット演算と論理演算は括弧つける事が多いね。
演算子の優先順位を覚えていても、
知らない(覚える気のない)人も多いから
括弧を付けた方がいい。
790デフォルトの名無しさん:2006/05/08(月) 10:38:00
エスケープシーケンスでカーソルを全角用の2文字分の長い方に意図的に換える方法ってないでしょうか
791デフォルトの名無しさん:2006/05/08(月) 10:38:36
792デフォルトの名無しさん:2006/05/08(月) 11:28:42
ヘタレな漏れに 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」しか帰ってこない


どうすればフルパス取得できるかを是非教えてください。
793デフォルトの名無しさん:2006/05/08(月) 11:39:07
>>790
機種依存。スレ違い。
このスレ的には、何も教えられる事はない。

>>792
環境依存。スレ違い。
このスレ的には、wprintf 使え。
794デフォルトの名無しさん:2006/05/08(月) 11:47:31
だったらどのスレ行けばいいの?
795デフォルトの名無しさん:2006/05/08(月) 12:19:14
魚屋に入って「ニンジンください」って言って「八百屋行け」って言われて「どこにあるの?」と訊いてるようなもんだ。
自分で探せ。
796デフォルトの名無しさん:2006/05/08(月) 12:24:22
ヒント:ユ○コー○
797デフォルトの名無しさん:2006/05/08(月) 12:30:17
792です。
793さんありがとうございました。

Cなんて10年ぶりく位なんで状況の変換に戸惑いまくりです。
*szPathにデータが入ってるのは確認できるのに、なぜ出力できない…って
戸惑っていたんですが、wprintfなんてのがあったんですね
てっきり、printfがunicode拡張されてるもんだと思い込んでおりました。

本当に的確なアドバイスありがとうございました。
798デフォルトの名無しさん:2006/05/08(月) 13:01:46
>>797
この場合は wprintf じゃなくて _tprintf を使え。
799デフォルトの名無しさん:2006/05/08(月) 13:23:07
>>798
いい加減、スレ違いな質問に答えるのは、
辞めていただけないでしょうか?


質問する方も「何が問題で自分はどうすべきか?」と言う一般常識くらい、
身につけていただきたいものだ…。
800デフォルトの名無しさん:2006/05/08(月) 13:27:44
そういうのが分からないからここで聞いてんだろ
だったら誘導したりなんなりすればいいだろ
全員がお前みたいにできるわけじゃないんだよ
何が一般常識だよ
801デフォルトの名無しさん:2006/05/08(月) 13:31:18
「公共の場ではTPOをわきまえろ」は一般常識だな。
例えば>>1を読むのは2chでは一般常識だろう。
それでの意味が分からないのなら、そもそもそのスレッドに投稿すべきではないな。
訊くべき場所がわからないなら、最初に汎用の質問スレに書くべきだ。
802デフォルトの名無しさん:2006/05/08(月) 13:33:49
>>800
低脳自慢は見苦しいゾ
803デフォルトの名無しさん:2006/05/08(月) 13:34:22
>>800
誘導してほしけりゃ誘導スレへ行けばいい。
自分の問題解決能力の欠如を他人のせいにするな。
804デフォルトの名無しさん:2006/05/08(月) 13:36:59
なんというか排他的な奴が多いよなプログラマって。
なんでだろ不思議だ
805デフォルトの名無しさん:2006/05/08(月) 13:40:12
だったらその質問誘導スレとやらを最初から教えてやればいいだろ
世の中にはお前らみたいなできるやつばかりじゃなくて
一般常識もなく低脳で問題解決能力のないやつもいるんだよ
806デフォルトの名無しさん:2006/05/08(月) 13:48:39
792,797です。
798さんアドバイスありがとうございます。
_tprintfなんてのがあるんですね。

少し、調べたんですがいまいち良くわかりません。
_tprintf は tchar.h でマッピングされてるルーチンで
_MBCS とか _UNICODEが定義されている場合に printf か wprintf に
処理を振り分けるような感じで認識してよいのでしょうか?

実は、VS2005 Expressは変な構成なようで
_tsetlocaleがまともに動きません(´Д⊂)
_tprintfは使ってみることにしますが。
なんか_MBCSなプログラムは厳しいかも…
これでは、Windows98では動かんプログラムになっちゃうのかな?
807デフォルトの名無しさん:2006/05/08(月) 13:55:08
792,797,806です。
スレ違いなんですね。悪かったです。もうきません(´Д⊂)
答えてくれた方々ありがとうございました。
808デフォルトの名無しさん:2006/05/08(月) 13:57:59 BE:104814296-#
>>804
排他的だとなんか問題あるんだろうか?
「あれこれ教えなくても済む人」だけを相手にしていた方が明らかに仕事の効率はいいんだけど。

>>805
>一般常識もなく低脳で問題解決能力のないやつもいるんだよ

そんな奴に優しくしてやる必要なんか無いわけで。
809デフォルトの名無しさん:2006/05/08(月) 13:58:47
>>804
レストランに行って「預金をしたい」と言って、
断られるのと何ら変わらない。

「餅が欲しい」と言われて、
「餅の専門店、もしくは餅も売っているスーパーの様な所に行ってください。」
と言っているのと何ら変わらない。


# 検索機能くらい有効に使って欲しいものだ。
810デフォルトの名無しさん:2006/05/08(月) 14:05:38
散々検索しましたが
811デフォルトの名無しさん:2006/05/08(月) 14:15:41
じゃあその散々とやらを聞かせてもらおうか
812デフォルトの名無しさん:2006/05/08(月) 14:17:05
このスレとかgoogleとか
813デフォルトの名無しさん:2006/05/08(月) 14:19:37
>>812
スレは検索して板は検索しないのか…。
それで「散々検索した」なんて、よく言えたものだ…。
814デフォルトの名無しさん:2006/05/08(月) 14:31:17
板っていうと例えば具体的に何って検索すればいいんだ
C言語のことだからそれらしきスレで検索したつもりだったが
815デフォルトの名無しさん:2006/05/08(月) 14:51:41
スレッド一覧で646しかねぇーんだから、見ろよ。
あと「あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。」って表に書いてあんだろ?
リンク先が終了してるとか、とぼけたことぬかすなよな。
816デフォルトの名無しさん:2006/05/08(月) 15:01:05
専ブラ使いなら当然のこと、
Web ブラウザで見てる奴でも
上部にあるスレのリスト右下に
「スレッド一覧はこちら」 というリンクがあるのは
見て判るだろう。

そうやって検索すると複数のそれらしいスレが
見つかるハズだし、それらのスレにどういう違いが
あるのかくらいは疑問に思わないのかと。
817デフォルトの名無しさん:2006/05/08(月) 15:04:18
> スレッド一覧で646しかねぇーんだから、見ろよ。
俺は初心者だと思ってなかったし、C言語のことだろうと思ったからここでいいと思ったんだよ
結局俺は初心者だったんだろうし、これからは然るべきスレで聞いてくるよ
> あと「あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。」って表に書いてあんだろ?
専ブラだから気づかなかったんだよ
818デフォルトの名無しさん:2006/05/08(月) 15:04:59
常識もなく出来の悪い子は何やっても駄目なんだから素直に諦めれww
819デフォルトの名無しさん:2006/05/08(月) 15:05:42
最後にリロードせずに書き込んだということを付け加えておく
820デフォルトの名無しさん:2006/05/08(月) 15:06:40
WW使いはヒク
821デフォルトの名無しさん:2006/05/08(月) 15:08:24
>>817
>専ブラだから気づかなかったんだよ
それは無知無能、或いは怠慢だな。
・無知
専ブラにもローカルルールを見る機能はある。
・無能
どこで質問したら言いかと疑問に思った段階でローカルルールに何か書いてないかと疑問に思うべき。
・怠慢
もし疑問に思ったのであれば、それを怠ったのだから怠慢だ。
822デフォルトの名無しさん:2006/05/08(月) 15:10:54
>>820
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
823デフォルトの名無しさん:2006/05/08(月) 15:15:36
いちいち書き込むのと読む機能以外はおまいらみたいに暇じゃないから面倒なんだよ
それにどこで質問したら言いかと疑問にも思わなかったし(ここでいいと思い込んでいた)
824デフォルトの名無しさん:2006/05/08(月) 15:17:25
>>823
そういうのはこっちの知ったこっちゃ無いね
825デフォルトの名無しさん:2006/05/08(月) 15:19:19
>>823
で?社会では自分に非があった場合、どうする?
・逆切れする
・逃亡する
・謝罪する
826デフォルトの名無しさん:2006/05/08(月) 15:20:03
>>825
おいおい、選択肢が足りなくて>>823が困るだろうがw
・親に泣きつく
827デフォルトの名無しさん:2006/05/08(月) 15:22:57
どうしてこうも分かり易い自作自演をするのでしょうか
私は頭が痛いですwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
828デフォルトの名無しさん:2006/05/08(月) 15:24:16
すれ違いがNGなのは分かるが、
こういう下らないやり取りはNGじゃないのな
829デフォルトの名無しさん:2006/05/08(月) 15:31:20
とうとう言い返す言葉がなくなったか
んじゃあそのすれ立てるまでもない何ちゃらとかいうところで聞いてくるからおまいら煽りに来るんじゃねえぞ
830デフォルトの名無しさん:2006/05/08(月) 15:37:47
>>829
気をつけて
831デフォルトの名無しさん:2006/05/08(月) 17:42:04
#define _XOPEN_SOURCE
#include <unistd.h>

char *crypt(const char *key, const char *salt);

この crypt 関数は、使ったあとに、ポインタに対して free しなくてもよいのでしょうか?
832デフォルトの名無しさん:2006/05/08(月) 17:57:11
>>831
スレ違い。
非標準関数は該当環境スレへどうぞ。
833デフォルトの名無しさん:2006/05/08(月) 17:57:22
>>831
標準Cに crypt() はなかったはずだが?
834デフォルトの名無しさん:2006/05/08(月) 18:34:46
妥協案として次のスレから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を増やす必要がないという判断はどうすればいいのですか?
通常こういった判定はどのようなものを使いますか?
836デフォルトの名無しさん:2006/05/08(月) 19:22:24
スレタイを「標準 C なら俺に聞け!」にして、
標準以外のスレのタイトルとリンクを貼る。

これでおk。
837デフォルトの名無しさん:2006/05/08(月) 19:23:53
>>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から正の無限まで)
839デフォルトの名無しさん:2006/05/08(月) 19:42:42
>>838
pow は使わずとも実装できる。
これ考えるのも宿題の範疇だろうから自分で考えれ。
ライプニッツとマチンと二乗のとで比較すんのかな?
まあ、ガンガレ。
840デフォルトの名無しさん:2006/05/08(月) 23:00:21
printfや、scanfのfはformatの頭文字だと考えていいでしょうか?
841デフォルトの名無しさん:2006/05/08(月) 23:02:21
>>840
関数 functionの頭文字
842デフォルトの名無しさん:2006/05/08(月) 23:10:23
>841マテw
843デフォルトの名無しさん:2006/05/08(月) 23:23:27
平林雅英の新ANSI C言語辞典だと print fortmat になってる
あの本は良いよ
技術評論者の回し斧みたいだけど
844デフォルトの名無しさん:2006/05/08(月) 23:29:55
回し斧ってこえーな
845デフォルトの名無しさん:2006/05/08(月) 23:35:26
>>843
>fortmat

フォートマット?
846デフォルトの名無しさん:2006/05/09(火) 00:11:38
838>>
おなじ学校カナー(゚д゚)
自分は普通にpowつかった
847デフォルトの名無しさん:2006/05/09(火) 00:17:23
>>840
一般的には「format」の頭文字と言われているが、
真偽は名付けた人のみが知るところ。
848デフォルトの名無しさん:2006/05/09(火) 01:20:40
だれか名付けた人にメールで聞いて
849デフォルトの名無しさん:2006/05/09(火) 02:00:18
printf
print with format
書式付き出力
850デフォルトの名無しさん:2006/05/09(火) 02:05:52
print formatted output じゃね?
851デフォルトの名無しさん:2006/05/09(火) 02:18:52
イイモデード
852デフォルトの名無しさん:2006/05/09(火) 02:22:41
ネットで検索すると

printf - format and print data
printf - print formatted output
printf - display a formatted string

こんなかな?
いずれにしてもprintfのfはformatでしょう
853デフォルトの名無しさん:2006/05/09(火) 02:27:37
printTだったら日本だけ高橋名人になってたな
854デフォルトの名無しさん:2006/05/09(火) 03:24:43
え?
855デフォルトの名無しさん:2006/05/09(火) 03:42:32
print は日本語では印刷。
いまだに印刷という単語を使っているところがまた長寿な感じがするが、
よく考えたら Java もそうだった。

Java よ。オマエは一体どこに印刷しているというのか。
856デフォルトの名無しさん:2006/05/09(火) 04:04:14
Cが誕生した頃のコンソールはテレタイプ端末だったからね
プリンターにキーボードがついたやつ

だからdisplayfでなくprintfなんだろうな
857デフォルトの名無しさん:2006/05/09(火) 04:05:09
そして print に display の意味が加わった、と。
858デフォルトの名無しさん:2006/05/09(火) 06:10:48
BASICに至ってはPRINTが画面出力でLPRINTが印刷だもんなぁ
スレ違いスマソ
859デフォルトの名無しさん:2006/05/09(火) 06:18:31
最初のUNIX&CはPDP-11で開発された

PDP-11↓
http://www.tom-yam.or.jp/2238/pdp11.html
860デフォルトの名無しさん:2006/05/09(火) 06:34:12
>>858
TTY端末にPRINT、ラインプリンタにLPRINTだね。
861デフォルトの名無しさん:2006/05/09(火) 06:47:38
壮大な活字ドラムに垂れ幕のようなインクリボン
ネクタイを巻き込まれたら(((( ;゜Д゜))) ガクガクブルブル
862デフォルトの名無しさん:2006/05/09(火) 09:04:54
>>859
UNIXはPDP-7
863デフォルトの名無しさん:2006/05/09(火) 10:33:32
>>862
でも、そのUnixはCじゃない。アセンブラで書かれたモノだ
864デフォルトの名無しさん:2006/05/09(火) 11:48:15
最初のUNIXがPDP-7なことには変わりない。
865デフォルトの名無しさん:2006/05/09(火) 12:54:28
最初のUNIX&C っつーとるやろげ。
866デフォルトの名無しさん:2006/05/09(火) 13:57:27
突然すいません
C言語でプログラムを組んでいるのですが、
どうもメモリリークを起こしているようです。
メモリリーク箇所を検出するにあたり何か良い方法
(チェック関数)等はありませんでしょうか?

ハード:SUN
OS:Solaris9 
言語:C
です。
867デフォルトの名無しさん:2006/05/09(火) 14:05:09
環境依存でない方法だと、mallocとfreeを別のマクロや関数に置き換えてログを取るという方法があるかな?
便利ツール等は環境依存スレ等適切な場所で訊いたほうがいいね。
868デフォルトの名無しさん:2006/05/09(火) 14:05:47
>>866
purifyでも使え
http://www.sra.co.jp/Rational/purify/purify.html
# 値段はウン十万だけどな

貧乏ならばメモリ操作関数を自作のメモリ操作と差し替えて
ログ出力して地道に追うしか無いだろうな。

あと、プロファイラでmalloc/freeの回数が一致してなければマズイとか言う方法もあるが
これは更にリークしてる箇所の追跡が厄介
869デフォルトの名無しさん:2006/05/09(火) 14:09:07
>>867
自分で malloc() と free() を書けばいいじゃん。
870デフォルトの名無しさん:2006/05/09(火) 14:12:40
あ〜、自分の書いたmallocも「別の関数」な。つーか「malloc」というのは「標準関数のmalloc」の意味。
マクロかましたほうが、__FILE__や__LINE__出せて便利じゃね?
871デフォルトの名無しさん:2006/05/09(火) 14:17:24
>>867
mallocとfreeを別のマクロや関数に置き換えてログをとる方法ですか・・・
すいません、初心者の為よく分からないのですが、
具体的に教えていただけないでしょうか?m(__)m
>>868
プロセス及びグローバル管理をH社のミドルを使用して実現している
ためpurifyは使用できませんでした・・・

ちなみに、malloc及びfreeの回数は一致していたのですが・・・
もしかしてメモリリークではないんですかね・・・
872デフォルトの名無しさん:2006/05/09(火) 14:21:08
個数じゃなくて回数なわけだけど、
よく分からないのにどうやって調べたんだ?

ログ取る malloc/free は、
コンパイラによっては既に用意されていることもある。
ただ、この話は該当コンパイラのスレで聞いた方がいい。
873デフォルトの名無しさん:2006/05/09(火) 14:22:34
本当にメモリリーク起きてるの?
そう思った根拠は?
874デフォルトの名無しさん:2006/05/09(火) 14:26:52
>>871
まぁ、回数が一致しててもfreeしてはいけない箇所をfreeしている可能性はある
リークよりも確保してないポインタをfreeする方が問題だな
875デフォルトの名無しさん:2006/05/09(火) 14:28:15
>>872
チェックツールがあったので、そのツールを使用してチェック
して見ました。
コンパイラのスレですかありがとございます。
>>873
再現率は
2台系のサーバーでここ一週間で2回coreを吐いてプロセスが死にました。
そして、coreをdbxコマンドを使用して解析した結果、提供されているH社
の通信ミドルで使用しているfprintfで落ちているらしく。
2台系とも同じ箇所で死んでます・・・
上記理由からどこかでメモリリークを起こしているのでは?と思ったのですが・・・
876デフォルトの名無しさん:2006/05/09(火) 14:28:57
環境依存の話だが、glibc を使っているなら今すぐ
malloc() のマニュアルページを読め。
MALLOC_CHECK_ の文字列を探せ。

877デフォルトの名無しさん:2006/05/09(火) 14:33:08
「メモリリーク」の用語を勘違いしてる気がするな。
メモリリークは不要なのに開放されないメモリ領域が発生することであって、
書いちゃいけないメモリに書き込むことじゃない。
ここで起きてるのは、書いちゃいけないメモリに書き込んでる方な希ガス。
動的配列の境界チェックした方がいいと思う。
878デフォルトの名無しさん:2006/05/09(火) 14:33:14
fprintf で落ちる ⇒ どこかでメモリリークしてる への思考の過程が理解できないな・・・

落ちているソバあたりから追跡するんでねーの?(外部ミドル提供関数の仕様も含めて)
# その結果として、メモリ不足発覚→なんでメモリ不足になるよ?→リークしてるじゃん ならわかるが
879デフォルトの名無しさん:2006/05/09(火) 14:34:15
free 後に書き込んでる可能性もあるな。
880デフォルトの名無しさん:2006/05/09(火) 14:34:23
例えば:
#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ヶ月なのに・・・わけわからないし・・・
なんかもう仕事やめたくなってきました(涙)
882デフォルトの名無しさん:2006/05/09(火) 14:36:28
coreがあってdbxもあって原因不明かよ
スタックトレースみたことあるのか?
883デフォルトの名無しさん:2006/05/09(火) 14:38:22
884デフォルトの名無しさん:2006/05/09(火) 14:39:41
>>881
char* p = malloc(32);

p[32] = 0;

みたいな事やってんじゃないのって事。
885デフォルトの名無しさん:2006/05/09(火) 14:39:47
新人にまかせる仕事じゃねなぁ、とか。
仕事中に2chに質問かよ、とか。
2chにフリーアクセスできるPC系の職場ってどんなだよ、とか。
突っ込みどころは満載なわけだが。
886デフォルトの名無しさん:2006/05/09(火) 14:42:08
>>881
上司はお前が理解できていると判断して渡した仕事かもしれん。
このまま、ココで質問しつづけても、不幸になるだけだ(スレ住人 & 上司 & お前)
ここに書いたようなことを、そのまま上司に相談汁。
887デフォルトの名無しさん:2006/05/09(火) 14:43:41
みなさんありがとうございました
上司に相談してみます・・・
それにしても情けないですね
本当にありがとうございました
888デフォルトの名無しさん:2006/05/09(火) 14:46:05
がんがれ
889デフォルトの名無しさん:2006/05/09(火) 14:50:02
>>874
環境固有では色々面倒みてくれそうだけど、標準だと char a; free(&a); の動作は未定義?
890デフォルトの名無しさん:2006/05/09(火) 14:50:50
C言語に限らず、ヤバイと思ったら上司に相談しろ
だが、相談する前に何がどうおかしいのかを整理してからな

# fprintfでcoreなんてほぼあり得ないから
# 上位関数でfprintfに変な引数を渡してるんだろうな...変な引数渡しやすい関数だし
891デフォルトの名無しさん:2006/05/09(火) 14:53:38
>>889
未定義

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/free.3.html
> free() はポインタ ptr が指すメモリ空間を解放する。
> このポインタは、以前に呼び出された malloc(), calloc(), realloc() のいずれかが返した値でなければならない。
> これ以外のポインタを指定したり、すでに free(ptr) が実行されていたりした場合の動作は定義されていない。
> ptr が NULL の場合には、なんの動作も行われない。
892デフォルトの名無しさん:2006/05/09(火) 14:59:21
>>890
二重 free() とか、free() してはいけないポインタを free() に
渡した後の fopen() とか malloc() とかで落ちるという現象は
体験したことある。昔の Sun 純正の C コンパイラのライブラリ
はそんな動作だった。この頃は Linux で gcc + glibc なので
MALLOC_CHECK_ が使えて楽だ。

893デフォルトの名無しさん:2006/05/09(火) 17:33:26
C言語ってMEでも使えるんですか
あと無料でできますか
894デフォルトの名無しさん:2006/05/09(火) 17:36:43
それくらいは自分で調べろ
895デフォルトの名無しさん:2006/05/09(火) 17:37:40
>>893
Meで使える無料のコンパイラもあるけどもVisual C++などのコンパイラを使いたければ2000かXPにするべき
896デフォルトの名無しさん:2006/05/09(火) 17:44:19
Microsoft Visual C++1.51 ってのが必要らしいんですけどどこにあるんですかね?

>>895
とりあえずVisual C++は使わないので・・・
897デフォルトの名無しさん:2006/05/09(火) 17:45:04
>>896
そんなときこそBorland
898デフォルトの名無しさん:2006/05/09(火) 17:46:09
899デフォルトの名無しさん:2006/05/09(火) 17:48:40
ありがとうございました
感謝します
900デフォルトの名無しさん:2006/05/09(火) 18:50:35
>>899
そんな悪のツールをつかってはいけません。ソフトウェアを自由に。

http://www.mingw.org/
901デフォルトの名無しさん:2006/05/09(火) 19:25:41
>>899
つーかそれ以前に>898はVC1.51ではない、それ用のツールだ。
902デフォルトの名無しさん:2006/05/09(火) 23:37:35
まあ学習用なら Cygwin でも使えば?
903デフォルトの名無しさん:2006/05/10(水) 01:34:18
初心者がCygwin使うと日本語の処理でerrorがでて躓く。
904デフォルトの名無しさん:2006/05/10(水) 01:36:30
関西では ARIA とガー君とひぐらしがかぶる。
全部見てるけど。
905デフォルトの名無しさん:2006/05/10(水) 01:37:34
誤爆すまんす
906デフォルトの名無しさん:2006/05/10(水) 08:23:04
GCCならOUTPUT_CHARSETいじるだけでちゃんとなるからすぐできるでしょ。
907デフォルトの名無しさん:2006/05/10(水) 19:42:56
某サイトのネタだが
#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に一回代入しただけなのに正しい結果を返すのは何故だ?
908デフォルトの名無しさん:2006/05/10(水) 20:12:09
8087自体のレジスタは80bitだから。
いったん64bit doubleへの変換してからintへ変換するのと
80bitから直接intへ変換するのの違いだとおもう。
909デフォルトの名無しさん:2006/05/10(水) 20:16:39
winでコンパイルするときどうしてますか?(BCC)
BATのファイル名を書き換えるのがめんどうになってきました
910デフォルトの名無しさん:2006/05/10(水) 20:20:06
コマンドプロンプトは飾りか?
911デフォルトの名無しさん:2006/05/10(水) 20:33:24
Makeなんて飾りですよ
912デフォルトの名無しさん:2006/05/10(水) 20:35:27
>>909
スレ違いだが、BccDevでググルと幸せになるかもしれないな
俺はmakeファイルの方が好きだがな
batファイルはcygwinを入れたら使う気がなくなる
913909:2006/05/10(水) 21:17:49
makeってそういうことできましたっけ。ヘルプみたけどできないような・・
BccDevとcygwinを入れられない環境でs。
BATのコマンドを駆使してできないかな。できそーな気がしないけど
914デフォルトの名無しさん:2006/05/10(水) 21:41:31
具体的に言うと、どういう風にしたいの?
915デフォルトの名無しさん:2006/05/10(水) 21:56:19
つーか、おまいらスレ違いだ。
916デフォルトの名無しさん:2006/05/10(水) 22:46:45
Borland C++ Compiler 5.5をインストールしたんですがコンパイルしようとすると
エラー E2209 c:\my documents\プロジェクト\tist\tist.c 3: インクルードファイル 'stduo.h' をオープンできない
となってしまいます
bcc32.cfgとilink32.cfgはC:\borland\bcc55\binに入れてあって間違いはないと思います
917デフォルトの名無しさん:2006/05/10(水) 22:47:45
-I"c:\borland\Bcc55\include"
-L"c:\borland\Bcc55\lib"

もbcc32.cfgに書いたのですが・・
918デフォルトの名無しさん:2006/05/10(水) 22:59:57
>>916
ソフトウェアの使い方は該当スレへ。
919デフォルトの名無しさん:2006/05/10(水) 23:09:42
失礼しました
920デフォルトの名無しさん:2006/05/10(水) 23:26:37
>>909
コマンドライン引数でいいんジャマイカ?
921デフォルトの名無しさん:2006/05/10(水) 23:53:52
これからCを始めようと思うんですがこの「エディダ」ってのいうのは買わなければ
いかんのでしょうか?それとも無料でダウンロードできるところがあるんですか?あるなら教えてください
922デフォルトの名無しさん:2006/05/10(水) 23:55:44
無理してスレを盛り上げなくていいですよ
923デフォルトの名無しさん:2006/05/11(木) 00:05:42
盛り上がってないよ
924デフォルトの名無しさん:2006/05/11(木) 00:17:25
>>916
stdio.h
925デフォルトの名無しさん:2006/05/11(木) 01:58:25
>>909
統合開発環境使えばクリック一発
926デフォルトの名無しさん:2006/05/11(木) 02:04:20
ここって超初歩的な質問してもいいですか?
927デフォルトの名無しさん:2006/05/11(木) 03:22:49
realloc()について質問があります。realloc()関数は、

『指定したヒープメモリのブロックを、指定したサイズに変更して再度割当て、
古いメモリブロックにあったデータは可能な限り新しいメモリブロックにコピーされる』

という挙動をするようですが、この『可能な限り』とはどんな状態を指すのでしょう?
例えば、物理メモリを1024MBを積んだマシン上で、
malloc()によって768MB領域確保したポインタに、realloc()によって再度800MBの領域確保をしたとすると、
どのような挙動をするのでしょうか?

上記の例だと、768MB+800MB > 物理メモリ(1024MB) となってしまって、
一時的に物理メモリの容量を超えてしまうのではないかと思うのですが、どうでしょうか?
この場合でも古いメモリブロックにあったデータは新たなメモリブロックにコピーされるのでしょうか?
もし古いメモリブロックが新たなメモリブロックにコピーされるとしたら、
その場合は物理メモリで足りない分のメモリ分だけHDDにスワップが発生するのでしょうか?

メモリ節約のため、realloc()を小まめに呼び出すようなプログラムを書こうかと思っているのですが、
上記の例のようなことが起きるのではないかと危惧しています。
このようなプログラムを書くのはよくないのでしょうか?
928デフォルトの名無しさん:2006/05/11(木) 03:39:23
>>927
C言語の仕様では、あなたが考えているような都合のいいそんな概念は無い。
929デフォルトの名無しさん:2006/05/11(木) 03:50:02
邪魔なデータが無ければそのまま 768MB の領域が
800MB にそのまま延長されるだけかもしれないが、
そういう事は期待しない方がいい。
普通はスワップガリガリしつつ新しいメモリ領域から確保するか、
メモリの確保に失敗するかだろう。
こういうメモリの確保の仕方は、普通しない。

必ず連続領域として扱わないといけないなら最大値で一気に確保。
連続領域でなくていいなら、
完全にリストにすると色々無駄だから、
ある程度の長さの配列を要素に持つ連結リストを作る。
930デフォルトの名無しさん:2006/05/11(木) 04:00:31
>>927
>928、>929はあーだこーだと言っているが要は環境依存だ。
自分でそのような実験プログラムを作って試してみるといい。
案外最低限のディスクアクセスで済むかも知らん。
#少なくとも>929が書くようなメモリ確保に失敗するほど蛸なOSは少ないだろう。
931デフォルトの名無しさん:2006/05/11(木) 04:06:34
Cygwin の GCC でメモリ確保をしてると、
思ったより少ない所でメモリ確保に失敗するね。
MinGW だと問題ない状況でも、失敗する事がある。
932デフォルトの名無しさん:2006/05/11(木) 04:38:14
>>931
ふつーのUNIX系OSはulimitとかlimit とかでリソースの限界を変えられる
ようになっている。Cygwinだとどうだか分からないけどこれにも互換性が
ある場合はメモリの限界とかは変更可能かも知れないぞ。
933デフォルトの名無しさん:2006/05/11(木) 04:49:24
>>931 の状況では、
MinGW でコンパイルしたものを Cygwin で動かして大丈夫で、
Cygwin GCC でコンパイルしたものを Cygwin で動かして失敗した
2GB 弱メモリを確保したんで、
Cygwin 用にする事による若干のメモリ増が
悪さしたのだと思ってる。
残念ながら limit は関係ないと思う。
934デフォルトの名無しさん:2006/05/11(木) 06:47:32
>>928
>メモリ節約のため、realloc()を小まめに呼び出すようなプログラムを書こうかと思っているのですが、 

「小さな親切、大きなお世話」の典型例
935デフォルトの名無しさん:2006/05/11(木) 07:36:53
>>927
> この『可能な限り』とはどんな状態を指すのでしょう?
サイズ小さくしたら、あふれた分はコピーされないよ
ってことじゃないの?

いずれにせよ、物理メモリとかページングとかは意識しない。
936デフォルトの名無しさん:2006/05/11(木) 08:20:00
Cでやってるなら自分でreallocに相当する動作を書いてみりゃいい。
そうすりゃ↓この辺の気持ちもなんとなく分かるよ。
> この『可能な限り』とはどんな状態を指すのでしょう?
937デフォルトの名無しさん:2006/05/11(木) 10:16:30
>>928-936
レスありがとうございます。
データ長が可変で、メモリ量を大きめに設定して静的に確保すると、
それこそ1GBぐらい余裕で消費してしまうので、
できれば動的に必要な分だけ確保したかったのですが、
考えが甘かったようです。
リストにすることを考えつつ、何か良い方法がないか頑張ってみます。
皆さんどうもありがとうございました。
938デフォルトの名無しさん:2006/05/11(木) 10:38:16
>>937
環境書いてないから判らんが(尤も書いてあったらスレ違いだが)、
malloc()で1GB確保してもその時点ではスワップは発生しないと思うのだが。
必要量が比較的初期の段階で確定するなら、大量に確保→realloc()で不要部を解放、でもいいだろう。
939超初心中の初心者:2006/05/11(木) 14:44:38
C言語勉強し始めて3ヶ月ぐらいの初心者ですが、「構造体」「共同体」についての説明
はいくら読んでもモヤットしていますけど、分かりやすいような説明が載ってある参考書
とかありましたら、教えてもらえませんか?
よろしくお願いします。
940デフォルトの名無しさん:2006/05/11(木) 14:45:53
>>921
Windows ならとりあえずメモ帳でも使っておけば?
その他、フリーで沢山あるので探せばいい。
941デフォルトの名無しさん:2006/05/11(木) 14:49:43
>>939
3ヶ月いくら読んでもモヤットする奴が読んでも、分かりやすく書いてある参考書ですか?
なかなか条件が厳しいな・・・
とりあえず、なにが分からんのよ?
942デフォルトの名無しさん:2006/05/11(木) 14:50:52
僕はCを10年は使っていますが、「エディダ」を使ったことがありません
「エディダ」なんてなくても開発は出来ます。

あ、ちなみにエディタはvi(m)だけどな。
943超初心中の初心者:2006/05/11(木) 14:54:22
>>941
宣言のところかなぁ?
944超初心中の初心者:2006/05/11(木) 14:56:29
>>942さん
viってUNIXでWinのメモ帳みたいなエディタですよね?
945デフォルトの名無しさん:2006/05/11(木) 15:04:54
Unixではviは標準のエディタだが、機能はメモ帳よりはるかに優れているので
メモ帳ごときと一緒されては困るな。
946超初心中の初心者:2006/05/11(木) 15:10:31
みたいなものって言ってましたけど、同じとかは言ってません;;;
私もviの方がいいと思っていますので(^^;;)
947デフォルトの名無しさん:2006/05/11(木) 15:43:38
読んで分かろうとするな。書け。
948デフォルトの名無しさん:2006/05/11(木) 15:54:59
すまん、Cを使って20年になる漏れに、「共同体」というやつが何物か教えては貰えまいか。
949デフォルトの名無しさん:2006/05/11(木) 15:57:22
一心同体少女隊の親戚でしょう、多分。
950超初心中の初心者:2006/05/11(木) 15:58:37
参考書の演習問題もPCでやってましたが、その一つ一つの意味が完全に理解できなくて、
説明文読んでも、やはり理解できなかった・・・申し訳ないほどバカです・・・;;;
951デフォルトの名無しさん:2006/05/11(木) 16:04:17
>>937
だから配列のリストにしろ、と。
952超初心中の初心者:2006/05/11(木) 16:04:32
>>948
「共同体」:全体で1つしか値を記憶することができない、同時に別の値を記憶することが出来ない。
つまり、共同体のメンバは、一度に1つだけしか値を記憶できない。

っと、参考書はこう書いた・・・
953デフォルトの名無しさん:2006/05/11(木) 16:06:04
それは共用体。
それに、配列や構造体を含んでれば、
複数の値を記憶できる。
954デフォルトの名無しさん:2006/05/11(木) 16:06:25
理解するんじゃない。感じるんだ。
955超初心中の初心者:2006/05/11(木) 16:08:15
感じるって・・・?
956デフォルトの名無しさん:2006/05/11(木) 16:17:19
良いコードをたくさん読んで、自分でもコードを書いて経験を積めってこと。
957デフォルトの名無しさん:2006/05/11(木) 16:18:46
>>944
いや。UNIXでメモ帳みたいなエディタは emacs の方だ。
但し機能は雲泥の差。
958デフォルトの名無しさん:2006/05/11(木) 16:19:21
>>954
ホースを使え。
959超初心中の初心者:2006/05/11(木) 16:21:25
ただ読んでいて、理解出来なかったら、意味ないのでは?
ある程度の理解はやはり必要でしょ?^^;;
960デフォルトの名無しさん:2006/05/11(木) 16:25:53
ただ読むのはバカのやることだ。
961デフォルトの名無しさん:2006/05/11(木) 16:26:55
そんな理屈を捏ねている暇に書け。そして間違えろ。
そうするうちにどうすれば使えるか感じられるようになる。
そうして更に書けば、自ずと理解できているもんだ。
962デフォルトの名無しさん:2006/05/11(木) 16:31:02
>>957
emacsは別途インストールしないとダメじゃないか
/binに入っていない事も致命的に非標準
963デフォルトの名無しさん:2006/05/11(木) 16:39:37
理解するまでは弄くり倒す、分かってきたら他人のソースを見て勉強。
964超初心中の初心者:2006/05/11(木) 16:43:08
なるほど・・・
965デフォルトの名無しさん:2006/05/11(木) 17:34:32
どうすれば二つ以上のcやcppを使えるのか・・
#include "xxxxx.cpp"とかは書いてないし
966デフォルトの名無しさん:2006/05/11(木) 17:35:25
分割コンパイルでググれ
967デフォルトの名無しさん:2006/05/11(木) 17:45:58
>>965
> #include "xxxxx.cpp"
これでも出来るよ。激しくお勧めできないけど

多分、コンパイルとリンク違いがわかってないんだろうな
968デフォルトの名無しさん:2006/05/11(木) 17:58:16
「リンク違い」ってなんだ?
969デフォルトの名無しさん:2006/05/11(木) 18:05:55
「の」が抜けたんだろうよ。
970デフォルトの名無しさん:2006/05/11(木) 18:19:26
>>965
CやC++はけっこうファイル構造に依存していたりする。staticやexternなんかはそのためのキーワード。
最も依存してるのはJavaで1ファイル1クラスが推奨されている。
971デフォルトの名無しさん:2006/05/11(木) 18:26:12
>>962
それはOSやディストリビューションやインストール時の指定によって変わる。
972デフォルトの名無しさん:2006/05/11(木) 18:26:54
>最も依存してるのはJavaで1ファイル1クラスが推奨されている。

Java 使った事あんの?
public クラスの事なら1ファイル1クラスは推奨じゃなく強制。

非 public クラスを作ることは問題ないが、
それを作るかどうかは隠す必要があるかどうかで決めることで、
推奨だの非推奨だのそういう問題じゃない。
973デフォルトの名無しさん:2006/05/11(木) 18:27:31
>>970
惜しい。Java は 1 ファイル 1 public クラス、だ。
public でないクラスは同じファイルにいくつあってもいい。
974デフォルトの名無しさん:2006/05/11(木) 18:58:14
CスレでJava使ったことあるの?煽っても無意味じゃねーか?

ちなみに
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html
の3章ではpubic classかinterfaceと関係している場合は
privateなclassとinterfaceを同じソースファイルに入れても良い
とかいうニュアンスで書かれてる。
意訳すれば原則1ファイル1クラスと言えなくもない。
975デフォルトの名無しさん:2006/05/11(木) 19:00:41
>>974
>>972-973 をもうちょっと良く嫁。
976デフォルトの名無しさん:2006/05/11(木) 20:03:09
WNDCLASSEX構造体ってMSDNに載っていない??
977デフォルトの名無しさん:2006/05/11(木) 20:11:03
978デフォルトの名無しさん:2006/05/11(木) 20:11:09
スレ違い
979デフォルトの名無しさん:2006/05/11(木) 20:24:56
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 126
http://pc8.2ch.net/test/read.cgi/tech/1145799128/




↓の人スレ立てお願い
980デフォルトの名無しさん:2006/05/11(木) 21:43:55
とくに何もしないことを指して

#define NOP 0

〜〜〜

 NOP;

の様に書いたら、わずかでもCPUの負担になりますか?
(コンパイル時でなく、実行時)
981デフォルトの名無しさん:2006/05/11(木) 22:06:56
>>980
0; は何の動作もしないので、
おそらく最適化しようがしまいが削られて
全く負担にならない。

全く意味のない処理を入れてみても、
最適化してると削られる事がある。
何か計算して、最終結果をどっかで使わないと。
プログラムの最後に出力するだけでもいい。
982デフォルトの名無しさん:2006/05/11(木) 22:09:57
volatile修飾した変数に適当に突っ込むと消えないと思う
983デフォルトの名無しさん:2006/05/11(木) 22:10:13
0;が実行時にどのように処理されるというのか
984デフォルトの名無しさん:2006/05/11(木) 22:14:33
>>980
ならない
あなたは何も「要求」を書いていないのだから
985デフォルトの名無しさん:2006/05/11(木) 22:15:35
>>981-984
判りました
どうもありがとうございます
986デフォルトの名無しさん:2006/05/12(金) 01:22:10
申し訳ないですが真偽を教えてもらいたくコピペしました

あるソフトウェアのソースコードにこんな関数があるんです。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の文字列を渡すと メモリが破壊されますよね?
987デフォルトの名無しさん:2006/05/12(金) 01:30:13
メモリ破壊と言うか何というか(^^;
これ書いた奴死ねって感じ?
988デフォルトの名無しさん:2006/05/12(金) 01:37:08
ソースに間違いまたは通常やってはいけないことがあれば指摘してもらえるとありがたいです
989デフォルトの名無しさん:2006/05/12(金) 01:44:13
>while (*--s1)
> if ((*s1 != ' ') && (*s1 != '\t'))
>  break;
' ' や '\t' が見つからなければ
文字列の先頭を超えて逆走。
というか、*s1 で何を判定しようとしてるんだ?
s と s1 との比較だろう、ここは。
990デフォルトの名無しさん:2006/05/12(金) 01:54:01
教えていただきどうもありがとうございます
991デフォルトの名無しさん:2006/05/12(金) 03:01:31
質問させていただきます
null文字というのはスペースということなのでしょうか?
例えばHTMLファイルの中にnull文字が含まれる可能性はありますでしょうか?
null文字に付いて詳しく教えていただけたらありがたいです
992デフォルトの名無しさん:2006/05/12(金) 03:08:10
0x0000のことだが
993デフォルトの名無しさん:2006/05/12(金) 03:38:21
文字コードが 0 の文字のこと。
994デフォルトの名無しさん:2006/05/12(金) 03:49:58
文字コードが0の文字が何を意味するのか聞きたいんだろ
995デフォルトの名無しさん:2006/05/12(金) 03:52:53
C だと文字列の終端を表すのに使われる。
特殊な状況だともうちょい利用されるが。
996デフォルトの名無しさん:2006/05/12(金) 03:53:49
> null文字というのはスペースということなのでしょうか?

いいえ。

> 例えばHTMLファイルの中にnull文字が含まれる可能性はありますでしょうか?

はい。
997デフォルトの名無しさん:2006/05/12(金) 03:58:51
>>996
> > 例えばHTMLファイルの中にnull文字が含まれる可能性はありますでしょうか?
>
> はい。
ホント?
998デフォルトの名無しさん:2006/05/12(金) 04:03:27
うっかり間違えて、通常のテキストファイルにぬるっと入り込んでることもあるよな?
999デフォルトの名無しさん:2006/05/12(金) 04:09:04
別に HTML に null 文字入れることは可能。
これ使って null バイト攻撃っていうのが可能なことが。
10001000:2006/05/12(金) 04:09:50

    /  ̄ ̄ ̄ ̄ ̄ ヽ
   / //ノノノ人ヽ   ヽ
  | /        \ヽ |
  || ''''''    '''''' :::::::ヽ /
  .|(●),   、(●) .::|-、
  |   ,,ノ(、_, )ヽ、,, .:::::|り|  ぬるぬるしている感じだった
  .|   トェ盆ェイ  ..::::::|- '
   \.  `ニニ´  .::::/
   ,ィ介ー‐--‐一イ|\
  /| | | |ヽヽ/,イ| | | | |ヽ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。