【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/


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

【初心者歓迎】C/C++室 Ver.42【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1188748806/
C/C++の宿題を片付けます 95代目
http://pc11.2ch.net/test/read.cgi/tech/1187944110/


【このスレ住人としての心得】
ビットシフトはなんの役に立つのでしょうか でググれ
2デフォルトの名無しさん:2007/09/20(木) 13:23:05
【質問者の絶対心得】
このスレは初心者スレではありません。Cの手練れが悩んで悩んでわからない事を
質問するスレです。スレのレベルに合わない低レベル質問は禁止です。
質問する前に先ず自分で最低1週間はいろいろ調べましょう。
K&Rに書かれているような事は質問しないこと
3デフォルトの名無しさん:2007/09/20(木) 15:13:48
>ビットシフトはなんの役に立つのでしょうか でググれ
もうこのスレが出て来る
ぐーぐるさんはえーマジはえー
4デフォルトの名無しさん:2007/09/20(木) 22:42:27
CHAR_BIT が 16 の処理系で fputc( 1000, fp ) で書き込んだファイルを
CHAR_BIT が 8 の処理系で fgetc( fp ) を読んだら何が返ってきますか?
5デフォルトの名無しさん:2007/09/20(木) 22:51:13
整数の加算や積算の結果オーバーフローしたか(あるいはするか)
判定するにはどういう方法があるんでしょうか

インラインアセンブラ使うならオーバフローフラグ調べて終了なんですが、
C言語レベルでの検知方法を知りたいです
6デフォルトの名無しさん:2007/09/20(木) 22:57:16
標準ではありません。
でもDSP系のコンパイラなら書けます。
もっとも専用に拡張されているのかも知れませんが。
7デフォルトの名無しさん:2007/09/20(木) 22:57:34
演算結果が演算前より小さくなっていたら、オーバーフローとか。
8デフォルトの名無しさん:2007/09/20(木) 23:31:24
同一機種用の処理系で、それぞれCHAR_BITが異なるという例はないと思う。
だから、わからない。

ケースバイケースともいえる。
9デフォルトの名無しさん:2007/09/20(木) 23:42:32
int a, b;
if ((long long)a + b > INT_MAX) printf("overflow");
10デフォルトの名無しさん:2007/09/21(金) 00:44:06
>>9
a, b が負数のときはどうなんです?
11デフォルトの名無しさん:2007/09/21(金) 00:46:26
(long long)a + b < INT_MIN
12デフォルトの名無しさん:2007/09/21(金) 05:37:53
>>5
符号なしではオーバーフローは決して起きないので
(ラップアラウンドするのは仕様)検出できません。
符号ありでオーバーフローが起きた場合の動作は未定義なので、
処理系依存の検出方法が存在するかもしれませんが
一般にはやはり不可能です。
13デフォルトの名無しさん:2007/09/21(金) 09:37:08
void MergeSort(int x[ ], int left, int right);
void main(void);

void MergeSort(int x[ ], int left, int right)
{
int mid, i, j, k;
if (left >= right) /* 配列の要素がひとつなら */
return; /* 何もしないで戻る */
mid = (left + right) / 2; /* 中央の値より */
MergeSort(x, left, mid); /* 左を再帰呼び出し */
MergeSort(x, mid + 1, right); /* 右を再帰呼び出し */

for (i = left; i <= mid; i++)
temp[i] = x[i];

for (i = mid + 1, j = right; i <= right; i++, j--)
temp[i] = x[j];

i = left; /* i とj は作業領域のデーターを */
j = right; /* k は配列の要素を指している */

for (k = left; k <= right; k++) /* 小さい方から配列に戻す */
if (temp[i] <= temp[j]) /* ここでソートされる */
x[k] = temp[i++];
else
x[k] = temp[j--];
}

こういうマージソートって後ろからマージしていく感じでしょうか?
あと、グローバル変数を使わずにポインタで領域確保していったほうが
いいでしょうか?
14デフォルトの名無しさん:2007/09/21(金) 11:46:20
UINT_MAX が 2 の累乗 - 1 以外の処理系は ISO/IEC 9899:1990 に適合しているといえるでしょうか?
たとえば UINT_MAX が 99999 の処理系があっても問題ないでしょうか?
最低値が 65535 という記述は見つけたのですが。
15デフォルトの名無しさん:2007/09/21(金) 13:15:28
>13
「後ろからマージしていく感じ」ってなんだ、もっと厳密に話せ
でないと「お前がそう感じるならそうなんだろう」としか言えん

ソートできる配列の大きさに制限をかけたくないなら
必要に応じてallocするしかない
16デフォルトの名無しさん:2007/09/21(金) 13:20:03
前と後ろの両端からマージしてく
左右どちらかの配列が終わったときの処理を別に書かなくていい分、短くかけることが利点
1713:2007/09/21(金) 14:20:02
>>15
まだわかってないのでイメージでしか言えなかったです。すいません
>>16
なるほど。ありがとうございます
18デフォルトの名無しさん:2007/09/21(金) 14:22:58
#include <stdio.h>
int main(void)
{
int no1,no2,max;

puts("整数二つを入力してください。");
printf("整数1:"); scanf("%d",&no1);
printf("整数2:"); scanf("%d",&no2);

if (no1==no2)
puts("二つは同じです。");
else if (no1>no2)
max=no1;
else
max=no2;
printf("大きい値は、%dです。",max);

return (0);
}

で0と0を入れると、
「二つは同じです。
大きい値は、1です。」と出ます。
なぜですか?
19デフォルトの名無しさん:2007/09/21(金) 14:26:09
no1==no2のとき、maxに値を代入してないからたまたま最初から入ってた数字が表示されてる
20デフォルトの名無しさん:2007/09/21(金) 14:31:41
数値が同じときに「大きい値は〜」を表示させたくないのなら、
最初のelseの後ろのifからreturnの手前までを{}で囲む
21デフォルトの名無しさん:2007/09/21(金) 14:34:43
#include <stdio.h>
int main(void)
{
int no1,no2,max;

puts("整数二つを入力してください。");
printf("整数1:"); scanf("%d",&no1);
printf("整数2:"); scanf("%d",&no2);

if (no1==no2)
puts("二つは同じです。");
else if {
(no1>no2)
max=no1;
else
max=no2;
printf("大きい値は、%dです。",max);
}

return (0);
}
したら、
If文に ( がない(関数 main )
とエラーがでます。
22デフォルトの名無しさん:2007/09/21(金) 14:37:14
else { if
23デフォルトの名無しさん:2007/09/21(金) 14:39:07
>>22
thx!
24デフォルトの名無しさん:2007/09/21(金) 19:04:29
const char** と char* const * と const char* const * の違いがよくわかる
説明サイト、参考書があったら教えていただけませんか? JISX 3010の当該章の提示
でも結構です。

よろしくおねがいします。
25デフォルトの名無しさん:2007/09/21(金) 19:36:51
if (n1>n2)
max=n1;
else
max=n2;

max=(n1>n2) ? n1:n2;
とはどう違いますか?
26デフォルトの名無しさん:2007/09/21(金) 19:42:21
>>25
結果は同じだが、後者の方が速い
27デフォルトの名無しさん:2007/09/21(金) 19:45:19
いや同じでしょう
28デフォルトの名無しさん:2007/09/21(金) 19:45:31
また適当な事言ってスレを盛り上げようとして〜
29デフォルトの名無しさん:2007/09/21(金) 19:48:43
アセンブリ見てみなよ
30デフォルトの名無しさん:2007/09/21(金) 19:51:33
結局どっちなの?
31デフォルトの名無しさん:2007/09/21(金) 19:55:48
>max=(n1>n2) ? n1:n2;
これって()要らないんじゃない?
max=n1>n2 ? n1:n2;
でいいんじゃない?
32デフォルトの名無しさん:2007/09/21(金) 20:07:42
>>30
同じ
>>31
いい
33デフォルトの名無しさん:2007/09/21(金) 20:39:35
>>24もおながいします..
34デフォルトの名無しさん:2007/09/21(金) 21:13:07
constは直後のトークンを修飾する。

const char** p1; //charを修飾
char* const * p2; // char *を修飾
const char* const * p3; //charと char *を修飾
ならば
**p1がconst
*p2がconst
*p3と**p3がconst
だと想う。
35デフォルトの名無しさん:2007/09/21(金) 21:15:48
36デフォルトの名無しさん:2007/09/21(金) 22:17:52
num?printf("その数は0ではない。"):printf("その数は0。");

(num)?printf("その数は0ではない。"):printf("その数は0。");
のほうがいいですか?
37デフォルトの名無しさん:2007/09/21(金) 22:27:47
if-elseのほうがいい。常考。
38デフォルトの名無しさん:2007/09/21(金) 22:30:56
C言語ってなんですか、
39デフォルトの名無しさん:2007/09/21(金) 22:32:01
>>36
どうでもいい。
40デフォルトの名無しさん:2007/09/21(金) 22:33:48
Cライブラリのワイド文字(wchar_tとかwint_t)について質問です。
ユニコード(UTF16)では0x0000〜0xffffまでの値が文字の領域として
定義されているらしいですが、WEOFは0xffffと定義されています。
これだと文字とWEOFを区別できない様な気がするのですが、
0xffffの文字は存在しないと考えてよいのでしょうか?

ここを見ると一応未使用となっていますが、気持ち悪いです。
http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_F000-FFFF

なんでEOFじゃなくWEOFになったんでしょうね。
41デフォルトの名無しさん:2007/09/21(金) 22:33:49
三項演算子はその演算結果を使用しないのであればif-elseを使うべき。
printfの戻り値を利用するのなら丸っきり否定はしないが。
42デフォルトの名無しさん:2007/09/21(金) 22:37:22
>>31は正しいのですか?
()はつける必要ないのですか?
43デフォルトの名無しさん:2007/09/21(金) 22:39:01
max=(n1>n2) ? n1:n2;
でOKなら、
(num)?printf("その数は0ではない。"):printf("その数は0。");
もOKですよね?

max=n1>n2 ? n1:n2;
がOKなら、
num?printf("その数は0ではない。"):printf("その数は0。");
はOKですよね?

どっちが適切ですか?
44デフォルトの名無しさん:2007/09/21(金) 22:41:09
>>43
どうでもいいよ。
45デフォルトの名無しさん:2007/09/21(金) 22:41:17
>>41
そうなんですか。それなら、基本的にif-elseを使えばいいんですね。
46デフォルトの名無しさん:2007/09/21(金) 22:41:54
4つともおk
47デフォルトの名無しさん:2007/09/21(金) 22:42:32
>>41
ほっといてやれ
知ったばかりで使いたい年頃なんだ
48デフォルトの名無しさん:2007/09/21(金) 22:43:29
>>47
教科書に載っていたので、条件演算子を使ったんです。
でも、あまり使われていないんですね。
if-elseのほうがいいんですよね?
49デフォルトの名無しさん:2007/09/21(金) 22:45:41
>>43
演算子の優先順位について調べろ。
?:と=と>でどれがより優先されるか。
50デフォルトの名無しさん:2007/09/21(金) 22:49:56
>>48
異論もあるだろうけど、if文を使った方が読みやすい場合が多いと思う。
?:を使ってコンパクトに書いた方がいいという積極的な理由がなければif文を選択した方が無難だと思う。
51デフォルトの名無しさん:2007/09/21(金) 22:49:56
>max=n1>n2 ? n1:n2;
はNG
maxにn1が入る
52デフォルトの名無しさん:2007/09/21(金) 22:55:27
>>51
それはどんな処理系?
53デフォルトの名無しさん:2007/09/21(金) 22:56:16
>>52
C/C++処理系ではないことは確か
54デフォルトの名無しさん:2007/09/21(金) 22:57:28
5540:2007/09/21(金) 22:57:35
おい、さっさと教えろよ
56デフォルトの名無しさん:2007/09/21(金) 22:59:24
>>40
知るかヴォけ
57デフォルトの名無しさん:2007/09/21(金) 23:01:16
>>55
>>40 のリンク先をもう一度よく見なおしてみれば満足できるかも
58デフォルトの名無しさん:2007/09/21(金) 23:01:42
>>51
だから、
max=(n1>n2)?n1:n2;
がいいよ。()をつけるべき。
59デフォルトの名無しさん:2007/09/21(金) 23:01:49
>>40
異論もあるだろうけど、ここは条件演算子の是非を今更議論するような
幼稚なスレなので、他を当たって下さい。ちなみに自分もわかりませんので。
60デフォルトの名無しさん:2007/09/21(金) 23:06:03
>>59
芸風真似すんなww
61デフォルトの名無しさん:2007/09/21(金) 23:08:03
>>51>>58
ホレ。ググってきてやったぞ。
コレ見て落ち着いて来い。な?

ttp://www.bohyoh.com/CandCPP/C/operator.html
62デフォルトの名無しさん:2007/09/21(金) 23:09:57
>>40
頭悪いな。
16bit処理系だとEOFも0xffffなんだよ。
判る?
たとえると実際のハードウェアやOSでNULLの0を示す
アドレス付近を読み出し専用にして不正なアドレスをトラップする仕組みと同じ。
63デフォルトの名無しさん:2007/09/21(金) 23:12:17
>>62
分かってないのはお前じゃないのか?
6440:2007/09/21(金) 23:15:06
あー未使用じゃなくて「不使用」なのね。
よくわかった。
けど、wikipediaなんて信用すんなこのアホが!
って人もいるけど、その辺どうよ?
俺は信用したが。
65デフォルトの名無しさん:2007/09/21(金) 23:15:17
>>40
0xfffe, 0xffffはアプリケーション定義
66デフォルトの名無しさん:2007/09/21(金) 23:18:34
え、おれ今までwint_tってintなのかと思ってた
wchar_tなのかよ
やべえwwww
67デフォルトの名無しさん:2007/09/21(金) 23:28:56
>>40
wchar_tはunsigned shortになってるから、WEOFの時だけ
short→intとキャストすればEOFと共有できるよ。
68デフォルトの名無しさん:2007/09/21(金) 23:37:13
BOM
69デフォルトの名無しさん:2007/09/21(金) 23:41:13
>>67
WEOFの時だけ、って条件だと、
int my_fputwc(wint_t c, FILE *fp)
{ wint_t r = fputwc(c, fp);
return (r == WEOF) ? EOF : r;
}
みたいな書き方しかないと思うけど、
これを条件分岐させずに書く方法ってある?
70デフォルトの名無しさん:2007/09/21(金) 23:46:38
#include <stdio.h>

void wprt(char (*sp)[7], int n);

int main(void)
{
char str[3][7] = {"JAPAN", "USA", "FRANCE"};

wprt(str, 3);

return 0;
}

void wprt(char (*sp)[7], int n)
{
int i, j;

for(i = j = 0; i < n; i++, sp++, j = 0)
{
printf("string: %d line = ", i);
while(*((*sp) + j) != '\0')
{
printf("%c", *((*sp) + j ));
j++;
}
printf("\n");
}
}
71デフォルトの名無しさん:2007/09/21(金) 23:47:23
>>70のプログラムで、出力結果は
string: 0 line = JAPAN
string: 1 line = USA
string: 2 line = FRANCE


となるのですが、どうしても
*((*sp) + j)
の部分できちんと処理されてるのかわかりません

この書き方だと配列strの最初の「J」にjの値を足すことになるのでは?
なぜきちんとアドレスに1足したように処理されているのでしょうか?
72デフォルトの名無しさん:2007/09/21(金) 23:51:36
jは文字列のインデクス
増えるたびに
J A P A N
と順に指してる
73デフォルトの名無しさん:2007/09/21(金) 23:59:02
>>69
int wtbl[0x10000];
void dokkade_jikkou(void ) {
int i;
for (i = 0; i < 0x10000; i++)
wtbl[i] = i;
wtbl[0xffff] = EOF;
}
int my_fputwc(wint_t c, FILE *fp) return wtbl[fputwc(c, fp);]; }

256KB我慢できれば。
74デフォルトの名無しさん:2007/09/22(土) 00:06:00
>>71
ポインタの型スケーリング
75デフォルトの名無しさん:2007/09/22(土) 00:32:37
>>72 >>74

返答ども!
やってることは確かにそうなんですよねぇ

なんで*(sp + j)でやると異常終了するんでしょう?
アドレスを1づつ増やして、*でその1増えたアドレスを差せば
順番に出力されてもいいはずなのになぁ
76デフォルトの名無しさん:2007/09/22(土) 00:40:34
>>71
どこから引っ張ってきたソースだかしらんけど
spは要素7のcharの配列へのポインタだから*spは要素7のcharの配列そのものを意味するけど
これは直ちに要素7のcharの配列の先頭要素へのポインタつまりcharへのポインタに成り下がるので、
これにjを足せばそれは要素7のcharの配列の先頭要素から数えてj個目の要素を指すポインタになるから
*(*sp+j)は要素7のcharの配列の先頭要素から数えてj個目の要素を意味する
77デフォルトの名無しさん:2007/09/22(土) 00:44:06
>>75
spは要素7のcharの配列へのポインタだから、
これに1を足すと要素7のcharの配列のサイズぶん後を指す
charのサイズぶん後を指させたいならcharへのポインタにしなければならない
78デフォルトの名無しさん:2007/09/22(土) 00:44:21
spは「要素7の配列」へのポインタだから
有効なのはsp+0〜sp+2 の間だけ
spに1足すと
[JAPAN\0\0]
→[USA\0\0\0\0]
[FRANCE\0]
に移動する
JAPANの'A'に移動するわけじゃない
79デフォルトの名無しさん:2007/09/22(土) 00:49:13
こういう場合普通は char sp[][7] って書いて
sp[i][j] みたいに参照するんだけどな
なんだこのソース

それとも訓練用にわざとわかりにくい書き方をしてるのか
8075:2007/09/22(土) 01:11:26
みなさんありがとうございます!非常にすっきりしました。どんだけ悩んだことか・・・

spは配列strの先頭アドレスが入ってて、1足せば次の文字が出るもんだと思ってた
今の場合は2次元配列で要素数が7だからsp+1だと7つ分一気にずれるのか

で、*spにすることでcharへのポインタになり、1足せば次の要素に行く。と・・・

こんな感じであってるんでしょうか?
81デフォルトの名無しさん:2007/09/22(土) 03:19:35
> ユニコード(UTF16)では0x0000〜0xffffまでの値が文字の領域として
> 定義されているらしいですが、WEOFは0xffffと定義されています。
このそもそも間違いだらけの文章に誰も突っ込まないってどうよ
82デフォルトの名無しさん:2007/09/22(土) 04:28:28
どこが間違ってるか説明お願いしますよ
83デフォルトの名無しさん:2007/09/22(土) 04:30:29
1行目はC言語のワイド文字(Unicodeとは限らない)の話なのに
なぜか唐突にUnicodeが出てくる
WEOFは0xffffとは限らない
84デフォルトの名無しさん:2007/09/22(土) 10:19:03
たまたま40の処理系ではそうだったけど、ということで勘弁してやろうぜ。
85デフォルトの名無しさん:2007/09/22(土) 10:42:54
>80
あってる
86デフォルトの名無しさん:2007/09/22(土) 10:56:34
objと lib は同じようなものですか?

objを標準のlibフォルダに入れておけばコンパイル速いですか?
87デフォルトの名無しさん:2007/09/22(土) 11:09:52
複数の関数が入っているlibファイルを作って、<***.h>と書いたとき自動的に必要なlibファイルを読み込むように出来ますか?
printfとかは必要なlibファイルを勝手に読み込みますよね?
88デフォルトの名無しさん:2007/09/22(土) 11:14:15
環境とコンパイラによる
C言語そのものとは関係ない
89デフォルトの名無しさん:2007/09/22(土) 11:21:32
>>86
>objと lib は同じようなものですか?
Windowsのlibの話ならlibはobjのアーカイブ

>objを標準のlibフォルダに入れておけばコンパイル速いですか?
関係ない

>>87
ムリ
>printfとかは必要なlibファイルを勝手に読み込みますよね?
gccならlibc、VCならCRTが自動的にリンクされるだけで、ヘッダファイルとは関係ない
90デフォルトの名無しさん:2007/09/22(土) 12:09:33
↑リンカーを自分で作ったら可能
91デフォルトの名無しさん:2007/09/22(土) 12:12:15
JavaScriptに近いC++ありませんか?
92デフォルトの名無しさん:2007/09/22(土) 12:14:34
>>91
C#
93デフォルトの名無しさん:2007/09/22(土) 13:46:57
3つの数字が同じかどうかを
A==B==C
で比較できますか?
94デフォルトの名無しさん:2007/09/22(土) 13:50:05
できませんよ
95デフォルトの名無しさん:2007/09/22(土) 13:50:52
できますよ
96デフォルトの名無しさん:2007/09/22(土) 13:52:20
AもBもCも1である、という限られた条件なら可能w。
97デフォルトの名無しさん:2007/09/22(土) 13:52:43
そう思うならやってごらんよ
98デフォルトの名無しさん:2007/09/22(土) 13:59:01
>>95
お前バカだなぁ
わかってないんだから出てくるなよ
99デフォルトの名無しさん:2007/09/22(土) 16:13:40
できますよ
100デフォルトの名無しさん:2007/09/22(土) 16:15:38
できますん
101デフォルトの名無しさん:2007/09/22(土) 16:23:29
自演乙
102デフォルトの名無しさん:2007/09/22(土) 16:54:14
どうでもいいが、馬鹿は初心者スレで言ってくれ。
103デフォルトの名無しさん:2007/09/22(土) 17:21:48
>>87
>複数の関数が入っているlibファイルを作って、<***.h>と書いたとき自動的に必要なlibファイルを読み込むように出来ますか?
Visual C++ なら、ヘッダファイルに次のように書いておけば、mylib.libがリンクされる。
#pragma comment(lib, "mylib.lib")
104デフォルトの名無しさん:2007/09/22(土) 17:35:38
>>103
スレ違いは誘導しましょう。
105デフォルトの名無しさん:2007/09/22(土) 18:28:21
JIS X 3010-1993 6.2.1.2 から
負の整数 A を A の型と同じサイズか大きいサイズの符号無し整数 B に変換するとき
処理系の負の整数の表現がどうであれ B は A の 2 の補数表現と同じビットパターン
になると考えてもいいですか?
106デフォルトの名無しさん:2007/09/22(土) 18:36:22
規格は、処理系が採用している数値の内部表現(2's complementとか)には言及してないだろ。
だから、符号拡張が起きるかどうか(が聞きたいのだろうがそれ)も処理系による。
107デフォルトの名無しさん:2007/09/22(土) 18:38:41
とはいえ、まーそのへんの2's complementな処理系だと、

32bit signed int が INT_MIN
10000000000000000000000000000000
だったとして、それを64bit unsigned long longに代入したら
1111111111111111111111111111111110000000000000000000000000000000
だわな。

| B は A の 2 の補数表現と同じビットパターン
| になると考えてもいいですか?

だから、この答えはNoかな。

108デフォルトの名無しさん:2007/09/22(土) 18:58:19
規格では B の型の最大値 + 1 + A だから型のサイズが同じ処理系なら
負数の表現方法にかかわらず同じ結果になるんじゃないですか?
109デフォルトの名無しさん:2007/09/22(土) 19:00:18
>>108
規格の文言を一字一句たがわず書いてみて
110デフォルトの名無しさん:2007/09/22(土) 19:06:05
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら

>>105と前提が変化した件について。相手にするの止めようかな。

111デフォルトの名無しさん:2007/09/22(土) 19:18:17
ビットの話がしたいなら、規格持ち出すの止めて処理系書けよ。

112デフォルトの名無しさん:2007/09/22(土) 19:22:00
NicoVideo動画リンクが付いて超便利になった
http://www.freewebs.com/photoradio/?0/1103271
113デフォルトの名無しさん:2007/09/22(土) 19:27:03
if (sa > 10 || sa < -10)

if (sa>=11 || sa<=-11)
は同じですか?
114デフォルトの名無しさん:2007/09/22(土) 19:29:12
>>113
sa が整数型なら
115デフォルトの名無しさん:2007/09/22(土) 19:33:15
>> 109
JIS X 3010-1993 は会社にしかないし紙しかなく文が長いので
ここに書くには手間がかかりすぎます。
116デフォルトの名無しさん:2007/09/22(土) 19:42:48
>>113
お前宿題スレでしつこく書いてるバカだろ
お前だけだぞ、わかってないの
117デフォルトの名無しさん:2007/09/22(土) 19:45:33
>>115
身勝手な奴だな
118デフォルトの名無しさん:2007/09/22(土) 20:08:10
printfなどの関数でefgなど浮動小数点数の変換を行うとき、
私は四捨五入が行われるものと思っていましたが、
X3014 : 2003 7.19.6.1には「この変換は適切な桁数への値の丸めも行う」と書かれているのみです。

この丸めもFLT_ROUNDSに従うものなのでしょうか。
あるいは、私が見落としただけで、ほかの箇所で規定されているのでしょうか。
119デフォルトの名無しさん:2007/09/22(土) 20:13:55
>>113
こんなとこまで来ててフイタ
120デフォルトの名無しさん:2007/09/22(土) 20:24:25
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
121デフォルトの名無しさん:2007/09/22(土) 20:25:21
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
122デフォルトの名無しさん:2007/09/22(土) 20:25:47
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
123デフォルトの名無しさん:2007/09/22(土) 20:35:32
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑
124デフォルトの名無しさん:2007/09/22(土) 20:38:03
模倣犯では。
ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
125デフォルトの名無しさん:2007/09/22(土) 20:44:23
>>120-124
間違い探しか?
126デフォルトの名無しさん:2007/09/22(土) 21:01:22
Stand Alone Comlex(笑)
127デフォルトの名無しさん:2007/09/22(土) 21:02:33
>>109
C90 ではなく C99 であるが ttp://www.jisc.go.jp/app/pager?id=26811
6.3.1.3 に同じような内容がある。
UINT_MAX が 65535 のとき (unsigned int)(-1) は 65535 ということに
ならないでしょうか?
128デフォルトの名無しさん:2007/09/22(土) 22:13:22
intで2バイトってまだあるの?
129デフォルトの名無しさん:2007/09/22(土) 22:13:34
うん
130デフォルトの名無しさん:2007/09/22(土) 22:36:41
ifとswitchはどのように使い分ければいいですか?
131デフォルトの名無しさん:2007/09/22(土) 22:52:49
switchは複数個の定数値を取るかもしれない1個の変数を判断するとき
それ以外はif
というか全部if、else ifでも別に
132デフォルトの名無しさん:2007/09/22(土) 22:58:04
>>131
具体的に教えてください。
133デフォルトの名無しさん:2007/09/22(土) 22:59:41
>>132
具体的に聞いてください。
134デフォルトの名無しさん:2007/09/22(土) 23:00:20
>複数個の定数値を取るかもしれない1個の変数を判断するとき
というのが良く分かりません。
135デフォルトの名無しさん:2007/09/22(土) 23:05:31
知らなくておk
136デフォルトの名無しさん:2007/09/22(土) 23:07:42
分かったときに分かればいいだけの話
137デフォルトの名無しさん:2007/09/22(土) 23:09:55
>>134
if(xxx==0){
.....
}else if(xxx==1){
.....
}else{
.....
}
↑こういうのならswitchで↓この様に書けるけど
switch(xxx){
case 0:.....break;
case 1:.....break;
default:.....
}
↓こういうのはswitchを使って書けない
if(xxx==0){
.....
}else if(yyy==1){
.....
}else if(yyy==zzz){
.....
}else{
.....
}
138デフォルトの名無しさん:2007/09/22(土) 23:16:34
馬鹿な質問に対して列挙型を〜って素直に教えないところがこのスレの優しさだな。
139デフォルトの名無しさん:2007/09/22(土) 23:17:04
と言ってしまったけどswitchを複数使えば書けないことも無いか
でもやっぱりそこまでして使うくらいならifを使ったほうがいい
140デフォルトの名無しさん:2007/09/22(土) 23:19:48
>>138
皮肉なんか言ってないで教えたらどうなの。
141デフォルトの名無しさん:2007/09/22(土) 23:43:39
初心者スレじゃないんだから、わざわざ教えることもない。
142デフォルトの名無しさん:2007/09/23(日) 00:01:27
符号付き整数 x を2のn乗 (n は 0 から 8 の整数) で割って-∞方向の
整数に丸める整数演算はどのようにすればいいでしょうか?
Windows なら右シフトで x >> n のようにできますが処理系定義なので
一般的には右シフトではできないようですが。
143デフォルトの名無しさん:2007/09/23(日) 01:23:10
>>142
x / (1 << n)
144デフォルトの名無しさん:2007/09/23(日) 01:28:14
>>143
それだと負の数が0方向に丸められないか?
145デフォルトの名無しさん:2007/09/23(日) 01:43:54
>>144
んじゃ、負の数ん時は条件分岐して適当にやっておいて。
146デフォルトの名無しさん:2007/09/23(日) 02:38:31
>>127
ファイルが見つかりません。
ならない。
147デフォルトの名無しさん:2007/09/23(日) 02:39:26
ちなみに-(unsigned int)1なら65535になる。
148デフォルトの名無しさん:2007/09/23(日) 02:43:26
へ? (unsigned int)(-1) は UINT_MAX と同じだろ。
149デフォルトの名無しさん:2007/09/23(日) 02:46:46
>>146-147
何でそう思うか、きみが前提としている諸条件と共に述べよ。
150デフォルトの名無しさん:2007/09/23(日) 03:22:22
どーでもいい話してんなお前ら
151デフォルトの名無しさん:2007/09/23(日) 04:45:40
>>149
それはむしろ俺が>>127に言いたいんだが
152デフォルトの名無しさん:2007/09/23(日) 09:48:24
/*奇数か偶数か*/
#include <stdio.h>
int main(void)
{
int no;

printf("整数:"); scanf("%d",&no);

switch (no%2) {
case 0:puts("偶数");break;
case 1:puts("奇数");break;
}
return (0);
}
153デフォルトの名無しさん:2007/09/23(日) 10:14:31
switch (no%2) {
case 0:puts("偶数");break;
case 1:puts("奇数");break;
}



puts((no%2)?"奇数":"偶数");
154デフォルトの名無しさん:2007/09/23(日) 10:15:26
/*月の季節を表示 switchで*/
#include <stdio.h>
int main(void)
{
int no;

printf("月:"); scanf("%d",&no);

switch(no) {
case 3:
case 4:
case 5:puts("春です。");break;
case 6:
case 7:
case 8:puts("夏です。");break;
case 9:
case 10:
case 11:puts("秋です。");break;
default:puts("冬です。");break;
}

return (0);
}


155デフォルトの名無しさん:2007/09/23(日) 10:16:26
>>153
条件演算子は、見にくくなるから使わないほうがいいって言われたんですが、どうなんでしょうか?
156デフォルトの名無しさん:2007/09/23(日) 10:21:29
>>154
そらぁさすがに、defaultはエラー処理に使うべきじゃね?
157デフォルトの名無しさん:2007/09/23(日) 10:22:56
>>155
>>153が見にくい?
158デフォルトの名無しさん:2007/09/23(日) 10:27:14
>>153は十分に可読性を残してるだろ
159デフォルトの名無しさん:2007/09/23(日) 10:39:46
>>50参照。
160デフォルトの名無しさん:2007/09/23(日) 10:40:00
>>41
参照。
161デフォルトの名無しさん:2007/09/23(日) 10:41:06
>>154
/*月の季節を表示 switchで*/
#include <stdio.h>
int main(void)
{
int no;

printf("月:"); scanf("%d",&no);

switch(no) {
case 3:
case 4:
case 5:puts("春です。");break;
case 6:
case 7:
case 8:puts("夏です。");break;
case 9:
case 10:
case 11:puts("秋です。");break;
case 12:
case 1:
case 1:puts("冬です。");break;
default:puts("そんな月ありません。");
}

return (0);
}


162デフォルトの名無しさん:2007/09/23(日) 10:56:22
>>161
バグがある
163デフォルトの名無しさん:2007/09/23(日) 11:08:22
>>154,>>161
何故これを書いたの?この後に質問が続くのか?
先に意図を書いて欲しい...
164デフォルトの名無しさん:2007/09/23(日) 11:15:23
return (0); //(笑)

case 1:
case 2:puts("冬です。");break;
の間違い?
165デフォルトの名無しさん:2007/09/23(日) 11:31:54
>>163
多分>>134の例だろ
166デフォルトの名無しさん:2007/09/23(日) 12:42:42
>>147
6.5.3.3 単項演算子-の結果は,その(拡張された)オペランドの符合を反転した値とする。
オペランドに対して整数拡張を行い,その結果は,拡張された型を持つ。

拡張された型で負数を表現できない場合にどうなるかの記述を見つけることができ
なかったが,拡張された型に変換されると考えれば
(unsigned int)(-1) と -(unsigned int)1 は同じ結果になるんじゃないか?
167デフォルトの名無しさん:2007/09/23(日) 13:36:46
puts("\a負の数を入力しないでください。");
の\aはどんな意味がありますか?
168デフォルトの名無しさん:2007/09/23(日) 13:41:27
>>167
ビープ音を1回鳴らす。
169デフォルトの名無しさん:2007/09/23(日) 13:53:52
\a = alert
実際の動作は処理系依存。
ビープ音もあれば画面をフラッシュさせることもあるらしい。
170デフォルトの名無しさん:2007/09/23(日) 14:11:57
前者はaudible alarm、後者はvisible alarmと言うこともあるね。
171デフォルトの名無しさん:2007/09/23(日) 16:08:05
int no;
int sum;
no=1;
sum=2;

int no=1;
int sum=2;
は同じですか? どちらを使うべきですか?
172デフォルトの名無しさん:2007/09/23(日) 16:09:39
後者は古い規格だと使えない事がある
173デフォルトの名無しさん:2007/09/23(日) 16:23:02
>>172
それはないやろ。
174デフォルトの名無しさん:2007/09/23(日) 16:23:55
いいえ。このスレ的には全く問題ありません。
175デフォルトの名無しさん:2007/09/23(日) 16:25:57
>>172
そうなんですか。前者を使うほうがいいんですね。
176デフォルトの名無しさん:2007/09/23(日) 16:33:04
>>175
いいえ。後者を使うべきです。
177デフォルトの名無しさん:2007/09/23(日) 16:33:33
なんで?
178デフォルトの名無しさん:2007/09/23(日) 16:38:37
前者を使うべき理由がないからです。
179デフォルトの名無しさん:2007/09/23(日) 16:38:43
どっちでもいいだろ
180デフォルトの名無しさん:2007/09/23(日) 16:39:56
それだと 後者を使うべき理由が無いから前者を使うべきです とも言える
181デフォルトの名無しさん:2007/09/23(日) 17:05:35
>>172さんへ
質問者です。それは本当ですか?
ということは、前者を使ったほうがいいってことですか?
どうなんでしょうか?
182デフォルトの名無しさん:2007/09/23(日) 17:09:43
>>181
C89とC99あたりの違いで言ってるんだろうけど本当だよ
183デフォルトの名無しさん:2007/09/23(日) 17:11:06
ボーランドのbccを使っているんですが、
その場合も前者を使ったほうがいいですか?
184デフォルトの名無しさん:2007/09/23(日) 17:12:06
バージョンくらい書けよ
185デフォルトの名無しさん:2007/09/23(日) 17:13:22
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
ってなってます
186デフォルトの名無しさん:2007/09/23(日) 17:14:37
Borland C++Compiler 5.5.1
です。
187デフォルトの名無しさん:2007/09/23(日) 17:43:05
C++だと、初期化と代入が区別されるから、Cでも意識して使いわけてもいいんじゃないか?
188デフォルトの名無しさん:2007/09/23(日) 17:45:33
どういうこと?
189デフォルトの名無しさん:2007/09/23(日) 17:55:52
>>127,146-147,166
(unsigned int)(-1) は 6.3.1.3 p2 により UINT_MAX と同じになる。

"if the new type is unsigned, the value is converted by repeatedly adding or
subtracting one more than the maximum value that can be represented in the new type
until the value is in the range of the new type."

-(unsigned int)1 は 6.2.5 p9 により UINT_MAX と同じになる。

"A computation involving unsigned operands can never overflow,
because a result that cannot be represented by the resulting unsigned integer type is
reduced modulo the number that is one greater than the largest value that can be
represented by the resulting type."

引用は ISO のドラフト (n1124) からね。
190デフォルトの名無しさん:2007/09/23(日) 18:11:50
>>180
いいえ、後者を使うべき理由ならあります。
宣言以降代入までの不定値が存在する期間を排除することができるというのがそれです。
191デフォルトの名無しさん:2007/09/23(日) 18:21:32
互換性のために前者で書いたほうがいい
192デフォルトの名無しさん:2007/09/23(日) 18:26:22
Cで前者にしか対応してないコンパイラがまだまだ普及してる
互換性を切り捨てるには時期尚早
193デフォルトの名無しさん:2007/09/23(日) 18:29:23
っていうか、俺涙目みたいな・・・
194デフォルトの名無しさん:2007/09/23(日) 18:46:58
代入と初期化は違うんだよ!
初期化を怠ると、後でひでーめに遭うんだよ!
むしろ初期化は強制すべきなんだよ!
195デフォルトの名無しさん:2007/09/23(日) 18:51:24
そんな事言ってる君らはどのコンパイラ使ってるの?
196デフォルトの名無しさん:2007/09/23(日) 18:54:37
Kylix
197デフォルトの名無しさん:2007/09/23(日) 18:59:33
>>189
ありがとうございます。勉強になりました。
198デフォルトの名無しさん:2007/09/23(日) 20:01:38
>>194
私をお呼びですか?フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
199デフォルトの名無しさん:2007/09/23(日) 20:02:50
>194
代入を禁止したらいい。
200デフォルトの名無しさん:2007/09/23(日) 20:09:43
・変数の初期値は必ず決める
・変数への代入は可能な限り行わない(変数を使いまわさない)

でもコンテナとかポインタ先への間接代入はしょうがないよね。
201デフォルトの名無しさん:2007/09/23(日) 20:24:46
関数型言語でおk
202デフォルトの名無しさん:2007/09/23(日) 20:41:26
C++でもSICPの問題がとけるんだからきっとCでも解けるさ
203デフォルトの名無しさん:2007/09/23(日) 21:14:28
>>191
>>192
どこに初期化ができないCコンパイラがあるというんだ?
だれもブロックの途中だなんて一言も言ってないわけで、宣言できる場所でなら初期化代入は必ずできるわけだが。
204デフォルトの名無しさん:2007/09/23(日) 21:29:25
構造体変数のコピー初期化ができないコンパイラには遭ったことがある。
struct s a = {...}; /* これはいける */
struct s b = a; /* こっちはエラー */
205デフォルトの名無しさん:2007/09/23(日) 21:31:01
>>204
スレタイに注目。
206デフォルトの名無しさん:2007/09/23(日) 21:46:28
>>204
こいつ最高にアホ。
207204:2007/09/23(日) 21:47:18
>>205 何か問題でも?
208デフォルトの名無しさん:2007/09/23(日) 22:03:51
K&Rならいざしらず、ISOその他では204ができないといけないことになっている。
209デフォルトの名無しさん:2007/09/23(日) 22:08:32
ビットフィールドは、ビット演算を使わないように気を付ければ移植性は問題無しですか?
210デフォルトの名無しさん:2007/09/23(日) 22:15:17
>>209
メモリ上のレイアウトを意図したビットフィールドの使い方には移植性に問題があります。
ビット演算を使うかどうかは、あんまり関係ないでしょう。
211209:2007/09/23(日) 22:47:20
>>210
どうもありがとう。

ちなみに、処理速度的にはやっぱりビットフィールド使うとたいていの場合遅くなるもんですか?
どっちみち今やってるプログラムはメモリの制約があるので使わざるを得ないんですが…
212デフォルトの名無しさん:2007/09/23(日) 22:55:49
>>211
遅くなることのほうが多いだろうけど、使い方とコンパイラの実装の相性による。
速度は実測が基本。
213デフォルトの名無しさん:2007/09/24(月) 17:19:46
プログラミングが上達するコツ
http://pc11.2ch.net/test/read.cgi/tech/1190555031/
214デフォルトの名無しさん:2007/09/24(月) 21:50:47
clock()が本来返すべき値がclock_tの範囲を超えた場合ってどうなるんですか?
215デフォルトの名無しさん:2007/09/24(月) 21:55:11
If the processor time  used is  not  available  or  its  value cannot be represented, the function shall return the value (clock_t)-1.



216デフォルトの名無しさん:2007/09/24(月) 21:59:26
>>215
ありがとう。
217デフォルトの名無しさん:2007/09/25(火) 15:39:42
int sum;
int dig;
とint sum,dig;
とはどう違いますか?
218デフォルトの名無しさん:2007/09/25(火) 15:59:30
違わない
219デフォルトの名無しさん:2007/09/25(火) 16:17:39
C99の標準機能だけで、UNIXのsleepコマンドみたいな機能は実現可能ですか?
220デフォルトの名無しさん:2007/09/25(火) 16:19:40
whileとforはどう使い分けるべきですか?
221デフォルトの名無しさん:2007/09/25(火) 17:04:51
>>219
不可能

>>220
whileとforの仕様を本当に理解していたらそんな出るはずない
教科書読み直せ
222デフォルトの名無しさん:2007/09/25(火) 17:05:22
×そんな
○そんな質問
223デフォルトの名無しさん:2007/09/25(火) 18:10:20
そんなあー
224デフォルトの名無しさん:2007/09/25(火) 18:20:56
225デフォルトの名無しさん:2007/09/25(火) 21:46:08
>>219
system("sleep
226デフォルトの名無しさん:2007/09/25(火) 21:57:02
");
227デフォルトの名無しさん:2007/09/26(水) 00:47:34
JIS X3010 の 6.2.6.2 を読んだだけでは分からなかったのですが
int の負数の表現が 2 の補数で short の負数の表現が 1 の補数
という処理系はありえますか?
228デフォルトの名無しさん:2007/09/26(水) 01:08:58
灯油を燃やした熱で水蒸気を発生させてタービンを回して発電した電力で水を電気分解して得られた水素と酸素を爆発させてシリンダーを動かしてプロペラに伝えて走るホバークラフトくらいにはありえる
229デフォルトの名無しさん:2007/09/26(水) 01:39:47
面白くない
230デフォルトの名無しさん:2007/09/26(水) 01:46:44
>>228
ロジン貸そうか
231デフォルトの名無しさん:2007/09/26(水) 15:21:00
int goto;
int while;
int for;
とかintに関数を使ってもいいですか?
232デフォルトの名無しさん:2007/09/26(水) 15:23:13
>>231
gotoもwhileもforも関数じゃないが、予約語は変数名に使えない。
233デフォルトの名無しさん:2007/09/26(水) 15:43:22
#include <stdio.h>
int main(void)
{
int kara;
int made;
int kankaku;
int cnt;

printf("何cmから:"); scanf("%d",&kara);
printf("何cmまで:"); scanf("%d",&made);
printf("何cmごと:"); scanf("%d",&kankaku);

for (cnt=0; (kara+cnt)<=made; cnt=+kankaku) {
printf("%dcm ",kara+cnt);
printf("%.2fkg\n",(double)(kara+cnt-100)*0.9);
}

return (0);
}

これどこがミスってますか?
234デフォルトの名無しさん:2007/09/26(水) 15:43:33
>>232
thx!
235デフォルトの名無しさん:2007/09/26(水) 15:44:21
>cnt=+kankaku
ですね。thx!
236デフォルトの名無しさん:2007/09/26(水) 19:11:09
while (!cont)
ってどういう意味?
237デフォルトの名無しさん:2007/09/26(水) 19:16:18
!は以外ってこと
contだけのときは、0
!contは!0ってこと。
だから、0以外
238デフォルトの名無しさん:2007/09/26(水) 19:55:47
>>236はどういう意味ですか?
!contっていう部分です
239デフォルトの名無しさん:2007/09/26(水) 19:58:11
否定ってこと。0のこと。
240デフォルトの名無しさん:2007/09/26(水) 20:00:13
>>239
???

>>238
cont=0;
printf("cont=%d !cont=%d\n", cont, !cont);
cont=1;
printf("cont=%d !cont=%d\n", cont, !cont);
cont=2;
printf("cont=%d !cont=%d\n", cont, !cont);
cont=-1;
printf("cont=%d !cont=%d\n", cont, !cont);
241デフォルトの名無しさん:2007/09/26(水) 20:03:21
contの反対ですよ。
242デフォルトの名無しさん:2007/09/26(水) 20:08:26
アホばっか
243デフォルトの名無しさん:2007/09/26(水) 20:08:32
while文は0以外の時に真となりループする。
while(cont)は、contが0以外だったらループする。
while(!cont)は、「contが0以外」以外だったら、つまり0だったらループする。
244デフォルトの名無しさん:2007/09/26(水) 20:12:15
>while(!cont)は、「contが0以外」以外だったら、つまり0だったらループする。
どういう意味?
245デフォルトの名無しさん:2007/09/26(水) 20:28:37
どういう意味もなにも、それ以外の意味は無いんだが…

while ( ! (cont) )

こう書けば分かるかね?論理否定演算子あたりでググってくれ。
246デフォルトの名無しさん:2007/09/26(水) 21:15:22
釣られすぎ
247デフォルトの名無しさん:2007/09/26(水) 21:20:06
コントです
248デフォルトの名無しさん:2007/09/26(水) 23:02:38
誰がうまい事言えと・・・
249デフォルトの名無しさん:2007/09/27(木) 00:37:50
釣りだったのかよ。付き合って損した。こんなことしてもスレ住人が減るだけなのに。
250デフォルトの名無しさん:2007/09/27(木) 14:54:01
型 X と型 Y が signed 付きか unsigned 付きかの違いしかない整数型のとき
X x = A;
Y* y = (Y*)&x;
のあと
(Y)x と *y は同じ結果になりますか?
または ISO/IEC 9899:1990 のどのあたりで分かりますか?
251デフォルトの名無しさん:2007/09/27(木) 15:18:35
>signed 付き
>unsigned 付き
252デフォルトの名無しさん:2007/09/27(木) 16:13:37
#include <stdio.h>
int main(void)
{
int width,height,i,j;

puts("長方形");
printf("幅はいくつ?:"); scanf("%d",&width);
printf("高さはいくつ?:"); scanf("%d",&height);

for (i=1; i<=height; i++) {
for (j=1; j<=width; j++)
putchar('*');
putchar('\n');
}

return (0);
}
を採点してください。こうしたほうが、スマートだよとか、
速いよ、とかあれば教えてください。
253デフォルトの名無しさん:2007/09/27(木) 16:57:42
・scanf()は使わない方がいい。
・個数を回すループは 0 から n 未満とするのが一般的。
・forの中味の行が変わるなら括っておくのが無難。
・一文字変数は避けた方がいい。
・(0)は意味がないので 0 で充分。
254デフォルトの名無しさん:2007/09/27(木) 17:04:09
>>252
>>1
> GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は
> 専門の別スレッド↓があるのでそこへさようなら。
255デフォルトの名無しさん:2007/09/27(木) 18:35:24
>>253
このようなtoy programなら、scanfを使っていけない理由はない。
ループ制御変数はi,jのように1文字にするのが原則。無駄にcounterのようにすると返って読みにくい。
256デフォルトの名無しさん:2007/09/27(木) 18:50:05
>>253の他はどうですか?
257デフォルトの名無しさん:2007/09/27(木) 19:15:16
csvファイルを読み込んで構造体に格納するとき、
strtok()とsscanf()では、どちらを使う方がいいですか?
あるいはもっといい方法ありますか?
258デフォルトの名無しさん:2007/09/27(木) 20:02:16
>>257
基本的にscanfファミリーはガッチリフォーマットの決まったレコードや
データが空白で区切られたレコードを読むのに最適に出来ている
カンマ区切りの可変長データは、それが全部数値ならいいが、
文字列が混ざってると厄介なことになりやすいので、
そういう場合にはstrtokを使ったほうが楽な場合も多い

あとは具体的なデータの内容によるとしか言えないが、
"str,ing",255, …みたいなものまで読める完全に汎用なものを作りたいなら
strtokでもsscanfでもなく頭っから一文字ずつ読んで解釈するしかない
259デフォルトの名無しさん:2007/09/27(木) 20:02:30
#include <stdio.h>
int main(void)
{
int width,height;

puts("長方形");
printf("幅はいくつ?:"); scanf("%d",&width);
printf("高さはいくつ?:"); scanf("%d",&height);

for (int i=0; i<height; i++) {
for (int j=0; j<width; j++) {
putchar('*');
}
putchar('\n');
}

return 0;
}
260デフォルトの名無しさん:2007/09/27(木) 20:40:43
>>259
C99だね
261デフォルトの名無しさん:2007/09/27(木) 22:23:26
ピラミッドの作り方は、法則があるのですか?
scanf("%d",&n);

for (i=1; i<=n; i++) {
for (j=1; j<n-i+1; j++)
putchar(' ');
for (j=1; j<=(i-1)*2+1; j++)
putchar('*');
putchar('\n');

for (j=1; j<n-i+1; j++)

for (j=1; j<=(i-1)*2+1; j++)
の解説をお願いします。
262デフォルトの名無しさん:2007/09/27(木) 22:24:24
>>261
ピラミッドにもいろいろあるので、一概には答えられません。

なんて冗談は兎も角、>1を読んで初心者スレへどうぞ。
263デフォルトの名無しさん:2007/09/27(木) 22:26:22
>>262
thx! 移動します
264デフォルトの名無しさん:2007/09/28(金) 00:18:10
>>252
そもそも長方形であるためには width>0 && height>0 でないといけないんだから
それをチェックすべきじゃないのか?
265デフォルトの名無しさん:2007/09/28(金) 01:35:27
>>250
同じ結果になるとは言えない。
と 6.2.6.2 を読んで思った。
266デフォルトの名無しさん:2007/09/28(金) 22:25:05
相互参照するヘッダってどう書けばよいですか。
文字列ライブラリと、エラーラーブラリのヘッダで、
文字列ライブラリでエラーがあったらエラーライブラリの関数、
エラーライブラリ内では文字列ライブラリを使ってます。
頭が再帰でどうにかなりそおです。
267デフォルトの名無しさん:2007/09/28(金) 22:26:38
ちなみに
どっちかに自分のプロトタイプを置く方法は使いたくありません。
メンテが面倒なのでね。
268デフォルトの名無しさん:2007/09/28(金) 23:10:53
よく使われるこのイディオムじゃ駄目?

--foo.h
#if !defined FOO_H
#define FOO_H
#include "bar.h"
...(本体)
#endif
--

--bar.h
#if !defined BAR_H
#define BAR_H
#include "foo.h"
...(本体)
#endif
--
269デフォルトの名無しさん:2007/09/28(金) 23:18:55
>>266,267
文面からすると、関数の呼び出しをヘッダ内で行っている(つまり「定義」を書いている)???

通常は、ヘッダには、関数の[宣言のみ]書き、定義は別にするから、
互いに参照し合う必要はないはず。
270デフォルトの名無しさん:2007/09/28(金) 23:41:32
うるさいなー
もー
C++だってインラインで定義してんじゃん
分けるの面倒なの!
271デフォルトの名無しさん:2007/09/28(金) 23:44:20
>>268
それじゃダメだっつってんだろ
272デフォルトの名無しさん:2007/09/29(土) 00:10:39
関数定義がヘッダで行われてるなら、
2つのソースファイルで同じヘッダを読み込んだ時点で
関数の2重定義でリンク通らなくなるだろ。

相互参照云々以前に根本的にバグってる。
273デフォルトの名無しさん:2007/09/29(土) 00:18:55
>>272
ライブラリ使う側からなら何の問題もなし。
バグってるのはお前の頭。
274デフォルトの名無しさん:2007/09/29(土) 00:25:01
>>273
コンパイル出来ない両ライブラリとライブラリを使ってる部分のソース一式どっかにアップするか
日本語勉強し直すか、どっちかにしてくれ。
275デフォルトの名無しさん:2007/09/29(土) 00:26:01
わかんないなら引っ込んでろよ
うぜー
276デフォルトの名無しさん:2007/09/29(土) 00:28:43
自分だってわからないことがあるから質問に来てるんじゃないのか?
そう邪険にするなよ
277デフォルトの名無しさん:2007/09/29(土) 00:29:25
いや、これが正解なんだけど
278デフォルトの名無しさん:2007/09/29(土) 00:29:30
ヘッダに関数定義書くとかクソすぎだろマジで
279デフォルトの名無しさん:2007/09/29(土) 00:29:39
事故解決しました
280デフォルトの名無しさん:2007/09/29(土) 00:37:26
ヘッダ2つの中身を一緒にしちゃえば?
んで、片方は#include1行の適当なヘッダ名でっち上げる。
ソース管理楽だよ。
281デフォルトの名無しさん:2007/09/29(土) 00:42:48
>>280
今まさにそうしてるんだよね
気持ち悪いから変えたかったんだけど
いまのとこそれしか思いつかない
ほんとアホばっかだなここ・・・
282デフォルトの名無しさん:2007/09/29(土) 02:26:20
アホが多いのは否定しない。
283デフォルトの名無しさん:2007/09/29(土) 02:30:16
どんだけバカなんだよ
メンテが面倒だからプロトタイプ書かないとか
気持ち悪いなら他の言語使えば?
284デフォルトの名無しさん:2007/09/29(土) 02:36:14
どう考えても釣りだろう
285デフォルトの名無しさん:2007/09/29(土) 02:54:46
心の底から言ってるんじゃね?
そう考えると哀れみだけしか浮かんでこないので笑ってスルーできるよ。
286デフォルトの名無しさん:2007/09/29(土) 05:58:54
そもそもこのスレで扱う内容なのか?
プロトタイプ宣言と定義が一致しないとエラーになるISO/ANSI/JIS Cはおかしい
K&R時代の仕様に戻すべきだとか?
287デフォルトの名無しさん:2007/09/29(土) 06:37:27
むしろプロトタイプ宣言があれば凡ミスによるバグが減らせて保守が滅茶苦茶楽になるのにね。
機械にやらせられるところは極力機械にやらせるという発想がないやつはプログラマには向いてないな。
288デフォルトの名無しさん:2007/09/29(土) 21:53:36
ファイルをアップロードするCGIをCで作ってます。
バウンダリ文字列で区切られたデータを切り出す際の定跡的な物はありますか??

いまは、
・CRLFCRLFとなった時点をデータの始まり
・すべて書き込んだ後、CRLFまで戻ってそこをデータの終わりとする
って感じでやってます。
289デフォルトの名無しさん:2007/09/29(土) 22:04:13
>>288
Cの言語規約には含まれてはいないので、ご自由にどうぞ。
290デフォルトの名無しさん:2007/09/29(土) 22:51:49
>>289
いや、規約というかテクニックを教えていただけたらと思いまして。。。
291デフォルトの名無しさん:2007/09/29(土) 22:56:33
>>290
スレ違い。
292デフォルトの名無しさん:2007/09/30(日) 00:16:29
議題:このスレの存在意義について
293デフォルトの名無しさん:2007/09/30(日) 00:17:49
もちろん規格の範囲内についてを扱う。
それがなんのことやら理解できないやつが>>292みたいな疑問を持つ。
294デフォルトの名無しさん:2007/09/30(日) 00:20:45
低席(なぜか変換できない)
定石(じょうせき)
295デフォルトの名無しさん:2007/09/30(日) 00:31:52
定石は囲碁用語、定跡は将棋用語。
どちらもよみはじょうせき。

馬鹿の癖に無理に揚げ足とろうとするな
296デフォルトの名無しさん:2007/09/30(日) 01:19:03
将棋なんて知らないもん!
297デフォルトの名無しさん:2007/09/30(日) 08:03:43
288はネットワークプログラミングスレに誘導すればいいのか?
298デフォルトの名無しさん:2007/09/30(日) 12:20:31
>>289>>291

>>288の質問って結局

---------------------hoge

(ここがバイナリデータ部)
---------------------hoge--

ってフォーマットからデータ部を切り出すテクニック、ってことだよ。
これ追い返してたら何も質問できないだろw
ネットワークプログラミングに誘導しても、向こうの住人も困るんじゃないか。
通信関係なら兎も角、タダの文字列処理だもんな。。。
299デフォルトの名無しさん:2007/09/30(日) 12:25:29
>>298
ここは言語テクニックを語るスレでも初心者教習のスレでもありません。
標準Cでの仕様や実装を云々するスレです。
まして「データを切り出す際の定跡」と言った、言語に依存しない抽象概念を扱うスレではありません。
300デフォルトの名無しさん:2007/09/30(日) 12:33:23
>>298
標準Cにおける文字列処理の質問じゃないでしょ。
少なくともhtmlについて殆ど何も知らない私にとって、>288に書かれた以外に
データを切り出す手段があるかどうかなんて見当もつかない。
「こうこうこういうプロトコルで来るデータがある、どう切り出すべきか」というなら
話は別だが、>288を読む限り単なる初心者質問だからこの辺りで充分だろ。
--
C言語なら俺に聞け(入門篇) Part 19
http://pc11.2ch.net/test/read.cgi/tech/1190342593/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/
301デフォルトの名無しさん:2007/09/30(日) 14:47:35
スレタイトルをそろそろ変えたほうがいいかもしれんね
C規格なら俺に聞け!
とか
302デフォルトの名無しさん:2007/09/30(日) 14:55:20
C規格なら規格書嫁!とか
まあ、「規格」とか「標準」とかって言葉をいれておいた方がいいかもね。
303デフォルトの名無しさん:2007/09/30(日) 14:59:12
ISO/ANSI/JISがそういう意図を含んでいるはずだがね
304デフォルトの名無しさん:2007/09/30(日) 15:00:57
入門者がその意図をくめるはずもなく
305デフォルトの名無しさん:2007/09/30(日) 15:13:30
【ISO/ANSI/JIS以外の】 C言語なら俺に聞け! 【質問お断り!】Part 133

そもそも【】内を真面目に読む人少ないでしょ
>>1も読まれない、合致する質問もほとんど来ない
終了でいいんじゃね
306デフォルトの名無しさん:2007/09/30(日) 15:14:16
>>305
どう考えても字数制限引っかかるだろうが。あほか
307デフォルトの名無しさん:2007/09/30(日) 15:18:49
C言語なら俺に聞け(入門篇) Part 19
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132

上はコード質問可で、下は規約の解釈限定か。なかなか難しいなwww
308デフォルトの名無しさん:2007/09/30(日) 15:20:03
そんなのにマジレスされてもなあ
頭大丈夫?
309デフォルトの名無しさん:2007/09/30(日) 15:20:51
ごめんごめん
>>306の頭のことね
310デフォルトの名無しさん:2007/09/30(日) 15:22:39
C言語規格議論厨隔離スレ
でいいじゃん
311デフォルトの名無しさん:2007/09/30(日) 15:29:56
つーかどう考えても
ISO/ANSI/JIS
これいらないだろ。
取っちゃえよ。

標準Cなら俺に聞け!

テンプレ:
Q標準Cって何?
312デフォルトの名無しさん:2007/09/30(日) 15:32:31
切れちゃった。まあいいや。
>>2の心得とかも必要ない。誤解されるだけ。
313デフォルトの名無しさん:2007/09/30(日) 15:43:43
そりゃそうだな。
そもそも定義にうるさいはずの連中がなんで「C言語」とか「標準C」とか「C」とか
いちいち呼び方変えてるんだよ。
アホか。
314デフォルトの名無しさん:2007/09/30(日) 16:00:31
>>305
>俺に聞け!

>質問お断り!
はねえだろw
315デフォルトの名無しさん:2007/09/30(日) 16:05:12
【A】 B 【C】
とあったら、普通はBが正タイトルでACはサブタイ。ACは繋げて読む事が多い。
AやCに重みがあるスレはネタスレと決まっています。
316デフォルトの名無しさん:2007/09/30(日) 16:10:12
「標準C限定」ってのは、コーディングの際に標準Cを逸脱しないって
意味だと思ってたんだけど、違ってたんだな。
「標準Cそのものに関する質問限定」ってことだったんだねw
317デフォルトの名無しさん:2007/09/30(日) 16:13:35
>>315
ここってネタスレだったんだ
納得ww
318デフォルトの名無しさん:2007/09/30(日) 16:18:29
>>316
フツーに考えて、規約の質問だけでpart132まで行くはずもなく……

いつの間に乗っ取られたんでしょうね。
319デフォルトの名無しさん:2007/09/30(日) 16:19:28
>>316
規約に全く関係ない質問なら、他に質問スレたくさんあるからそっちへ行ってくれればいい
320デフォルトの名無しさん:2007/09/30(日) 16:20:44
321デフォルトの名無しさん:2007/09/30(日) 16:28:23
初めて家族でF1観戦をしてきたのですが、子供がバスの中でお漏らししてしまい
回りの皆様に迷惑をおかけしました、同乗していた方申し訳ありませんでした
322デフォルトの名無しさん:2007/09/30(日) 16:30:36
>>321
最後のマッサやばかったなw
あれは伝説に残る
323デフォルトの名無しさん:2007/09/30(日) 16:40:04
この流れは>>294を流そうとして必死なのか?
324デフォルトの名無しさん:2007/09/30(日) 16:53:01
ビール 5000ペリカ
カキピー 3000ペリカ
オムツ 20000ペリカ
325デフォルトの名無しさん:2007/10/01(月) 02:13:22
F1弁当 100000ペリカ
326デフォルトの名無しさん:2007/10/01(月) 13:47:11
なぜここでゆでが
327デフォルトの名無しさん:2007/10/01(月) 14:20:03
妙な流れで忘れ去られている >>250 だけど、
非負の値だけの場合
「二つの型において同じ値の表現は同じとする」(6.2.5 型)
負の値も含まれる場合
6.2.6 型の表現 の 6.2.6.2 整数型、により、負の値の表現は
処理系定義となっているので、結果は処理系定義

だと思う
328デフォルトの名無しさん:2007/10/01(月) 21:28:59
6.5.3.2 アドレスおよび間接演算子
正しくない値がポインタに代入されている場合,単項*演算子の動作は,未定義とする。

適合しない型のオブジェクトへのポインタが正しくない値と考えるなら未定義という
こともできないかな?
(83)の注釈にいくつか正しくない値の例があるがこれがすべてだとは言っていないようだ。
329デフォルトの名無しさん:2007/10/09(火) 18:51:48
内容:
作業時間48時間くらいで出来るC言語使った初歩レベルで作れるプログラムない?

都合よすぎかもしれないんだが、1年の節目としてなんか作れと先生に言われてるんだが
いい案がまったく出てこない、そういう例をまとめたサイトとかあれば最高なんだが。
330デフォルトの名無しさん:2007/10/09(火) 18:53:34
ちとコピペミスった申し訳ないorz

内容は時間内に作れれば何でもいいです。
331デフォルトの名無しさん:2007/10/09(火) 18:55:47
echod
332デフォルトの名無しさん:2007/10/09(火) 18:57:58
>>329
学生の1年目なら hit&blow
社会人の1年目なら 住所録(最大件数はメモリの許す限り無制限、10万件程度のデータに対して検索1秒以内)
くらいかな?
333デフォルトの名無しさん:2007/10/09(火) 19:39:45
>>330 >>1 を読め
>>331>>332 スレ違いに反応しない
334デフォルトの名無しさん:2007/10/09(火) 20:52:49
指定されたディレクトリとその下層にあるファイルの中から
指定された名前の関数定義を探し当てるプログラムというのはどうかなッ
335デフォルトの名無しさん:2007/10/09(火) 20:59:58
>>333
申し訳ない。
>>331>>332
ありがとうございます。
336デフォルトの名無しさん:2007/10/09(火) 22:54:24
宿題スレに行って他人の宿題盗ってくれば?
337デフォルトの名無しさん:2007/10/10(水) 00:13:55
後で苦労するのは俺だし授業で時間取ってくれてるからその時間暇になるわ。
338デフォルトの名無しさん:2007/10/11(木) 14:26:34
main()
{
int i;
int a[2][10];

for( i = 0; i < 10; i++ )
{
a[1][i] = i;
a[2][i] = i;
printf("i=%d j=%d\n",a[1][i],a[2][i]);
}
printf("\n");
printf("i=%d j=%d\n",a[1][1],a[2][2]);
}

Visual C++ 2005 Express Edition です。
これをコマンドプロンプトを使ってコンパイルすると、
結果表示後「問題が発生したため・・・」のエラーがでます。
どこかおかしいところはあるでしょうか?

下のprintf文2つは実行確認用です。
339デフォルトの名無しさん:2007/10/11(木) 14:33:04
>>338
>a[2][i] = i;
範囲外
340デフォルトの名無しさん:2007/10/11(木) 14:40:34
「Visual C++ 2005 Express Edition です。」と断らなければいけない
レベルの質問は基本的にはこのスレの対象範囲外
341デフォルトの名無しさん:2007/10/11(木) 20:52:46
まあ内容自体は処理系関係ないがな。
342デフォルトの名無しさん:2007/10/11(木) 20:53:42
だからこそ環境を書く時点でわかってない事の証左
343デフォルトの名無しさん:2007/10/13(土) 13:27:48
fopenで開いているファイルの大きさを切り詰める方法を教えてください。
一時ファイルとして使ってるんですが、自前のデフラグで前に積めた時、
後ろのゴミを消したいので。
344デフォルトの名無しさん:2007/10/13(土) 13:40:08
「C言語」で引っかかるスレで質問できそうなのがここしか見つからないのが問題
限定的な話題扱うならスレタイ自重しろよボケが
345デフォルトの名無しさん:2007/10/13(土) 13:54:09
なら、次スレからJISに合わせて「プログラム言語C」にするか
346デフォルトの名無しさん:2007/10/13(土) 13:55:40
〜なら俺に聞け がよくない。
347デフォルトの名無しさん:2007/10/13(土) 14:19:14
初心者お断りってスレタイで明言すればいいじゃん。きっと過疎って誰も来なくなるよ。
348デフォルトの名無しさん:2007/10/13(土) 14:24:04
C言語なら俺に聞け(入門編)があるのになぜそっちに行かないんだろう
349デフォルトの名無しさん:2007/10/13(土) 14:26:15
>>343
マルチすんな。あっちで回答しておいた。
350デフォルトの名無しさん:2007/10/13(土) 14:26:48
>>347
願ったり叶ったり。
351デフォルトの名無しさん:2007/10/13(土) 14:54:40
>>348
全角厨しか引っかからないな
愛用のかちゅ〜しゃで確認
352デフォルトの名無しさん:2007/10/13(土) 15:10:16
>>351
JaneDoeViewだと引っかかるから気がつかなかったよ
じゃぁこのスレも全角にすれば問題解決だな
353デフォルトの名無しさん:2007/10/13(土) 17:14:58
入門者のくせに「入門」で検索しないのか
354デフォルトの名無しさん:2007/10/13(土) 19:43:13
「入門」で検索って、しないでしょw
言葉使う側のオナニー
355デフォルトの名無しさん:2007/10/13(土) 19:49:16
ほんとスレ立て下手糞だね。
毎回こんな事で揉めるのは双方不愉快になるし時間の無駄。
このスレの存在自体迷惑だし削除した方がマシだよ。
356デフォルトの名無しさん:2007/10/13(土) 21:09:55
お前が立てればいいんじゃね?
357デフォルトの名無しさん:2007/10/13(土) 21:10:16
じゃ、[標準C限定、C++不可、初心者お断り]ってスレタイに明記しとけ。
358デフォルトの名無しさん:2007/10/13(土) 21:13:36
テンプレも読まない連中だから無駄な気もするな
359デフォルトの名無しさん:2007/10/14(日) 22:17:28
>>355
>このスレの存在自体迷惑だし
どんな迷惑を被ったのかkwsk
360デフォルトの名無しさん:2007/10/15(月) 00:44:03
調子こいて答えたら、規格に基づいて袋叩きにされた
361デフォルトの名無しさん:2007/10/15(月) 23:21:44
volatile int v1, v2;
int x = v1 + v2;

これは推奨できないらしいですが、
どういう理由なんでしょうか

どうやらvolatile変数の参照は副作用を持つかららしいのですが、
具体的にどのようなケースがあるのでしょうか
362デフォルトの名無しさん:2007/10/15(月) 23:25:55
>>361
式 v1 + v2 の v1 と v2 のどちらが先に評価されるか不定だから。
363デフォルトの名無しさん:2007/10/15(月) 23:37:50
言葉足らずでした
おっしゃる通り、評価順が不定なのはわかったのですが、

v = f() + g(); みたいなケースは
f()やg()内で副作用のある処理が行われたんだろうな〜
(グローバル変数をいじってるとか)
と想像はつくのですが

volatile変数の場合,
v1とv2が評価順に依存しているケースがあるって事なんでしょうか
その具体例が思い浮かばないです

364デフォルトの名無しさん:2007/10/15(月) 23:40:03
>361

ググりましたが、volatile修飾子はコンパイル時の最適化を抑制する修飾子とのこと
たぶん、排他制御の二重ロックなどの冗長に見える部分の最適化を止めたいのでは?
DOSのシングルスレッドなプログラムしか組んだことないからよくわからないが…

http://itref.fc2web.com/c/index.html#volatile
365364:2007/10/15(月) 23:41:50
質問の勘違いしてました。御免なさい
 m(_ _)m
366デフォルトの名無しさん:2007/10/15(月) 23:46:52
#include <stdio.h>
#define N 5
int main(void){
int data1[]={1,3,5,7,10};
int data2[]={2,4,6,8,9};
int data3[]=0;
int i = 0;
int j = 0;
if (data1[i] >= data2[j]){
data3[i + j] = data[i];
i++;
}
if (data2[j] > data1[i]){
data3[i + j] = data2[j];
j++;
}
else return 0;
for (i=0;i<N;i++)
printf("%d",data3[i]);
return 0;
}

何がおかしいですか?
367デフォルトの名無しさん:2007/10/15(月) 23:47:42
>>366
int data3[]=0;
368デフォルトの名無しさん:2007/10/16(火) 00:13:38
>>367
どうすればいいですか?
369デフォルトの名無しさん:2007/10/16(火) 00:19:25
>>363
未初期化の変数のロケーションを、必ず、読む、というコードが生成される、はず
規格では未初期化の自動変数を読んだ場合のふるまいはどうだっけ?

実際、どういう場合にまずいかというと
処理系(ここで言う処理系にはOS以下メモリやプロセッサまで含む)によっては
プロセスが、まだ書いたことのないロケーションを読もうとすると、メモリの
ゴミあさり(他のプロセスがパスワードとかを残してたりするの探す)と判断されて
例外で落とされるかもしれない、とか
370361=363:2007/10/16(火) 00:22:31
あぁぁぁすいません
変数は初期済みという前提でおながいします
371デフォルトの名無しさん:2007/10/16(火) 00:23:05
>>368
int data3[N]={0};
他にもおかしいところがあるかもしれないけど見てない
372デフォルトの名無しさん:2007/10/16(火) 00:26:17
>>363
volatileオブジェクトは例えばプロセッサの内蔵タイマのようなリアルタイムに値の変化するものを指しているかもしれない。
373デフォルトの名無しさん:2007/10/16(火) 00:27:16
ありがとうございます。
そこを直してもまだ1つエラーがありました。
data3[i + j] = data[i];
ここらしいです
374デフォルトの名無しさん:2007/10/16(火) 00:27:36
>>363
メモリマップド I/O だな。読んだだけでチップの信号が変わるとか。
375デフォルトの名無しさん:2007/10/16(火) 00:28:33
>>373
エラーメッセージ嫁。
読んで分からなかったらエラーメッセージ添えて聞け。
ここはエスパーごっこするスレじゃない。
376363:2007/10/16(火) 00:29:41
>>372
>>374
なるほど。ハードウェア絡みですね

確かに読むだけでデバイスの状態が変化する可能性がありますね

ありがとうございました!
377デフォルトの名無しさん:2007/10/16(火) 00:31:43
>>375
すみません。
エラー E2451 babble.cpp 10: 未定義のシンボル data(関数 main() )
だそうです。
378デフォルトの名無しさん:2007/10/16(火) 00:34:28
>>377
dataは1〜3だろ、無印は無い
たぶんdata3[i + j] = data1[i];
379デフォルトの名無しさん:2007/10/16(火) 00:38:27
>>377
なんでそこまで言われて気づかないんだ?
380デフォルトの名無しさん:2007/10/16(火) 00:40:35
BCC はこれがコンパイルエラーじゃなくてリンクエラーになるのか。恐ろしいな。
っていうか悪いことは言わないから VC++ 2005 EE か Cygwin GCC にしとけ。
381デフォルトの名無しさん:2007/10/16(火) 00:42:08
いくらBCCでもコンパイル通らないだろ
382デフォルトの名無しさん:2007/10/16(火) 00:43:00
完全な見落としですね…
すみません。ありがとうございました
383デフォルトの名無しさん:2007/10/16(火) 00:58:14
>>371

Cの配列は自動で領域拡張してくれないからdata3のメモリ領域は必ず確保することが必要だと。
data3[] = {0};
だとdata3の配列の長さは1です。今のままだと条件によってはバッファーオーバーランします。
384デフォルトの名無しさん:2007/10/16(火) 01:10:34
たまたま質問が標準C以内のものだったら回答してるって感じだな
>>366なんか標準Cと何の関係もない、ただのデバッグ依頼だろ
ちゃんと切り分けろよ
385デフォルトの名無しさん:2007/10/16(火) 01:10:34
>>383
Nがわざわざ定義してあるだろ
386デフォルトの名無しさん:2007/10/16(火) 01:20:08
>>371
現状の結果は data3[] = {3,*,*,*,*};
となる。*部は未定義かつ異常アクセス。
このデータの場合読み込みしかしていないが
二つのif条件が共に満たされている場合始めの*に書き込み
Windouwsなら共有違反のエラーダイアログが出て強制終了されると思います。

387デフォルトの名無しさん:2007/10/16(火) 01:24:34
突っ込むの面倒だし放置でいいかな?
388デフォルトの名無しさん:2007/10/16(火) 01:27:28
なんでいきなりBCC
389384=386:2007/10/16(火) 21:29:10
一つ見落としてました御免なさい…
390デフォルトの名無しさん:2007/10/23(火) 23:39:29
ぬるぽ
391デフォルトの名無しさん:2007/10/23(火) 23:56:21
ガッ
392デフォルトの名無しさん:2007/10/25(木) 02:01:37
int a = -1;
unsigned int b = a;
こうするとbは標準Cならどんな環境でもUINT_MAXになるんですが

unsigned int b = (unsigned int)a;
こうした場合って、このキャストは
(1)aのビットパターンを無理やり unsigned int として解釈するのか (C++のreinterpret_cast)
→負数の表現が2の補数なら UINT_MAX
 1の補数なら UINT_MAX-1
 絶対値と符号フラグなら…いくつだ?

(2)aをunsigned int に変換するのか (C++のstatic_cast)
→環境によらず UINT_MAX

どっちでしょうか?
あいにく手元には負数の表現方法が2の補数の環境しかないので、確かめられません
393デフォルトの名無しさん:2007/10/25(木) 02:06:39
って、>>189に書いてある説明文に思いっきり
(unsigned int)-1 って書いてあるな…
394デフォルトの名無しさん:2007/10/25(木) 02:16:57
>>392
C の話は解決したとして、 C++ の reinterpret_cast の理解が間違ってる。
reinterpret_cast で int → unsigned int の変換はできない。
reinterpret_cast による変換結果はすべて実装依存。ビットパターン云々とは言えない。
395デフォルトの名無しさん:2007/10/26(金) 12:00:55
>>364 volatile修飾子は、組み込み用プログラムでは多用するな。

    最適化では、値を読むことしかしてない変数は無駄なコードとして
   削除されてしまう。
   
    しかし、メモリマップドI/Oでは、I/Oのレジスタ類は変数として
   定義され、その内容の変化のみをチェックする処理は多い。 その様な
   変数には、volatile修飾子をつけないと最適化で消されてしまって
   処理が実行されない。 Cソース上では存在するが、機械語コードでは
   存在しなくなっている。 これを防止するのが主な使い方だな。
396デフォルトの名無しさん:2007/10/26(金) 14:43:41
>>395
それで思い出したがCPU自体にアトミックな操作ができない物があり、
そういうCPUではvolatileを完全に実現出来ないと聞いた。

具体的には16ビットCPUで32ビット変数を扱うと完全なvolatileには
ならない。16 + 16に分けて2回読み書きするためで、その間に割り込み
が入って内容を変更されてもCPUはそれに気づけない。
397デフォルトの名無しさん:2007/10/26(金) 16:52:48
>>396
>volatileを完全に実現出来ない
それは適当な表現じゃないなぁ。
単にvolatileではアトミックかどうかを意識できないだけの話だと思うんだ。
volatileがそれを保証する修飾子じゃないんだから実現できないってのとは違うでしょ。
398デフォルトの名無しさん:2007/10/26(金) 17:12:01
>>397
§6.7.3.6
An object that has volatile-qualified type may be modified in ways unknown to the
implementation or have other unknown side effects. Therefore any expression referring
to such an object shall be evaluated strictly according to the rules of the abstract machine,
as described in 5.1.2.3. Furthermore, at every sequence point the value last stored in the
object shall agree with that prescribed by the abstract machine, except as modified by
theunknown factors mentioned previously.114) What constitutes an access to an object that
has volatile-qualified type is implementation-defined.

確かに実装依存と書いてあるね。しかしアトミックである事を保証できないのならvolatile修飾子の意味は
無い事になってしまう。規格には保証されてなくても実際volatileをそのような目的に使うなら、CPU固有の
振る舞いを知っておく事は非常に重要なはずだ。
399デフォルトの名無しさん:2007/10/26(金) 17:30:16
主旨には同意するが

> アトミックである事を保証できないのならvolatile修飾子の意味は
> 無い事になってしまう。

これは言い過ぎ。例えば
volatile x;
x = 2;
x = 3;
の x = 2; が実行されることが保証されること等、
アトミシティ以外にも存在する意味はある。
400デフォルトの名無しさん:2007/10/26(金) 17:57:20
ベンチでCPU側にとって無意味なループを省略させないとかかね
401デフォルトの名無しさん:2007/10/26(金) 18:43:50
>>400
保証されない。
xが32bitだとして16bitのCPUなら、上位16ビットを代入した直後に
割り込みが入って上位16ビットを書き換えたらもうダメ。
402デフォルトの名無しさん:2007/10/26(金) 18:44:18
×>>400
>>399
403デフォルトの名無しさん:2007/10/26(金) 21:02:16
アトミックとvolatileは全然違う概念だと俺は信じてたけど…?

>>401
>>399は別に、xに2が設定されることが保障されると
言ってはいないと思う。
404デフォルトの名無しさん:2007/10/26(金) 21:30:30
すると。

int X
X = 1+1;
dly_tsk(100); /* ウエイト */
if(X==2)
これはXは必ずしも真とはいえないのと同じか・・・?(割り込みで値なんていくらでも変更できるので)
volatileは最適化の抑止であって値の保証とは違うと思うが。
それともなんか俺、頭がおかしいのか?

最適化といえば、よくあるのがF-ROMのライトシーケンスやイレースシーケンスとかなんか同じアドレスに0xAAだの0x55だの書くから
最適化されるとうまく動かなくなるね。

ちなみに組み込みをやるとハードがらみで泣かされることがしばしば。
センサ情報で何度泣かされたか。ノイズで何度泣かされたか。静電気で・・・
405デフォルトの名無しさん:2007/10/26(金) 21:31:10
setjmpとallocaって、呼び出しの前後順によってはlongjmpが
おきた時に何か問題おきるかな?
406デフォルトの名無しさん:2007/10/26(金) 23:03:52
自信を持っては言えないのだが、多分volatileがあることで、
(処理系の詳細ではなく仕様で定められたセマンティクスの範囲内でも)
実装可能になる並列データ構造とかは存在するんではなかろうか?
407デフォルトの名無しさん:2007/10/26(金) 23:11:46
ハードの熱で泣かされたことが……
408デフォルトの名無しさん:2007/10/26(金) 23:15:14
>>405をおながいします。
allocaでずれたスタックポインタlongjmpで先祖がえりしてしまうような
ことは無いのか、どうなんでしょう?
409デフォルトの名無しさん:2007/10/26(金) 23:15:59
スタックポインタ「が」longjmp
410デフォルトの名無しさん:2007/10/26(金) 23:24:37
>>401
そんなあなたに sig_atomic_t
411デフォルトの名無しさん:2007/10/26(金) 23:28:54
allocaがなんなのか知ってる?
412デフォルトの名無しさん:2007/10/26(金) 23:33:53
void *p;
int result;

result = setjmp();
if (!result) {
 p = alloca(256);
 hoge(); /* hoge calles longjmp, NO RETURN */
 /* NOT REACHED HERE */
}

/* ここで p の指す先は大丈夫か? */

ということ?
413デフォルトの名無しさん:2007/10/27(土) 00:21:05
>>412
そうそんな感じです。C言語として保証されてるのかな?と
ふと思ったので。
414デフォルトの名無しさん:2007/10/27(土) 00:39:46
allocaは標準Cで既定されている関数ではないから、実装依存としか言いようがない。
415デフォルトの名無しさん:2007/10/27(土) 00:40:12
alloca は C の標準関数じゃないので・・・
416デフォルトの名無しさん:2007/10/27(土) 00:45:12
ああそうなんだ。知らなかったっす。どうもありがとう。
417デフォルトの名無しさん:2007/10/27(土) 01:48:57
>>410
それがはC標準関数ではない
標準ではない型を別途定める必要があること自体C標準ではできないことの証明
418デフォルトの名無しさん:2007/10/27(土) 02:26:56
sig_atomic_t は <signal.h> で定義されてる ANSI C 標準の型ですが何か?
419デフォルトの名無しさん:2007/10/27(土) 02:45:54
関数ではないなw
420デフォルトの名無しさん:2007/11/05(月) 22:32:44
規制中につき携帯から失礼します。
2バイト文字の文字コードを持つint型の変数があるときに
この変数の文字コードに該当する文字を取得しようとしたのですが
char型にぶちこもうとしたら1バイトずつに分けられて格納されて、wcharを使っても分けられてしまうようなのですが
どうにか2バイトまとめて一つの文字コードだと判断させる方法はないでしょうか?
421デフォルトの名無しさん:2007/11/05(月) 22:37:42
Java の char と違って、ふつ〜 C の char は 8 ビットだからどうにもならない
422デフォルトの名無しさん:2007/11/05(月) 22:40:31
sage忘れたorz
423デフォルトの名無しさん:2007/11/05(月) 22:52:09
>>419
フイタw
424デフォルトの名無しさん:2007/11/05(月) 22:58:14
>>420
何言ってるのか良く分からん。

>wcharを使っても分けられてしまうようなのですが
この部分を検証したコードと実行結果plz
425デフォルトの名無しさん:2007/11/06(火) 00:29:42
scanfを使って整数型の変数に1〜100の値を入力された時のみ
続く処理をして、それ以外は再度入力を促すプログラムを作ってます。

入力された値のエラーのチェックにはどんな処理が必要か
わからないので教えてください。

あと数値を入力してEnterを押して実行したあとに
前回入力した数値が残ったままになっているのを
消すにはどうすればいいですか?
426425:2007/11/06(火) 00:32:34
スレ間違いすいません
初心者いってきます
427デフォルトの名無しさん:2007/11/11(日) 14:29:16
typedef struct _target
428デフォルトの名無しさん:2007/11/11(日) 14:42:22
>>427 そんなところに予約識別子使うやつ死ねって思う。
429デフォルトの名無しさん:2007/11/11(日) 19:55:32
>>428
構造体タグは独立した名前空間だから別にいいんじゃね?
C++に移植したときにはまらないとも限らんが。
430デフォルトの名無しさん:2007/11/11(日) 20:09:22
ダメなんだぜ。
7.1.3 Reserved identifiers
> - All identifiers that begin with an underscore are always reserved for use as identifiers
> with file scope in both the ordinary and tag name spaces.
431デフォルトの名無しさん:2007/11/15(木) 10:35:25
>>430
俺が訳してやるぜ

アンダースコアから始まる識別子を使うな、どアホ
432デフォルトの名無しさん:2007/11/15(木) 12:01:23
http://pc11.2ch.net/test/read.cgi/tech/1194016813/328-334
> 加減演算子
>
> ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
> 配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
> よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
> とする。

これ見て思ったんだけど、たとえばメモリ空間がアドレス 0x0000-0xffff の環境で、
メモリ空間の終端 16 バイトに char a[16] が割り当てられて a が 0xfff0 を指す場合、
a + 16 は 0x0000 に対応することになると思うんだ。で、さらにその実装が 0x0000 を
ヌルポインタとしていた場合、 a + 16 == 0 が真になるようなことがあるかもしれない。

これはオーバーフローっぽいから配列をそんなところに割り当てないようにしないと
いけないのかもしれないけど、実際のところ a + 16 はオブジェクトを指す必要がないから
ヌルポインタになったところで問題ないのかもしれないとも思う。

配列の最後の要素を一つ越えたところを指しているポインタがヌルポインタと
等しくなるような実装って、規格の範囲内なのかね?
433デフォルトの名無しさん:2007/11/15(木) 12:15:14
だめなんじゃない?

6.5.8 Relational operators の 5
>If the expression P points to an element of an array object
>and the expression Q points to the last element of the same array object,
>the pointer expression Q+1 compares greater than P.

char a[16] に対しては a < a+16 が成立しなきゃいけないらしい
434デフォルトの名無しさん:2007/11/15(木) 12:29:14
効率の面から全然現実的じゃないけど、大小比較においてはぬるぽを特別扱いして
最強としておけば a < a + 16 の要件は満たせる。明示的なぬるぽとの比較は
未定義動作だから、これによって規格から外れるということにはならない・・・かなり苦しいな。
435デフォルトの名無しさん:2007/11/15(木) 12:40:35
ってことは、アドレス 0 をヌルポインタに使っている実装で、 ROM や RAM が
アドレス空間の終端にあるようなときは、ちょっと気をつけて終端ぴったりにオブジェクトが
配置されないようにする必要がある、ってことになるのかな?

リンカに指示するマッピングで終端1ワード(バイト?)ぐらい予約にしてやればいいのか。
436デフォルトの名無しさん:2007/11/15(木) 18:22:24
>>434
>432のメモリモデルでユーザメモリ空間が0x8000以上なら、
ポインタ演算を符合付き整数で行なう実装ができそうだ。
437デフォルトの名無しさん:2007/11/15(木) 21:26:34
いかれた規格野郎のために、これでまともに動作すれば規格合致で portable なことが保証できる、規格の限界を極めた変態処理系とかできないもんかな。
438デフォルトの名無しさん:2007/11/18(日) 00:07:49
#include <stdio.h>
int main (void)
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d");
return 0;
}
printfの%dはいったいどうった仕様でよまれているんでしょうか?
439デフォルトの名無しさん:2007/11/18(日) 00:15:32
440デフォルトの名無しさん:2007/11/18(日) 00:19:39
>>438
printfの%dは、何を表示したいか最後に引数で指定しないとだめ

printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d", a, b, 42);
441デフォルトの名無しさん:2007/11/18(日) 01:10:04
>>439>>440
どうもです。
よくわからんかったんですけど、stdinのなかでも読んでるのかな?
いつもは書式("%d",a)見たいな感じで使ってるんですけど、
前問題で
scanf("%d",&a);
printf("あなたが入力したのは%dです");
があって、aの値が出力されたのでなんでだろうと思って聞いてみました。
442デフォルトの名無しさん:2007/11/18(日) 01:39:09
未定義動作なので、単なる偶然。
たぶんスタックが関係してるとおもうけど。
443デフォルトの名無しさん:2007/11/18(日) 11:11:03
> よくわからんかったんですけど、stdinのなかでも読んでるのかな?

違います。第2引数以降に順番に対応します。%d に限らずみんなそうです。
>>440 の例をよく吟味してみてください。

> 前問題で
> scanf("%d",&a);
> printf("あなたが入力したのは%dです");
> があって、aの値が出力されたのでなんでだろうと思って聞いてみました。

の答えが >>442 で、何かの問題としてそういうプログラムがあったのだったら、
それは誤植かバグ。
444デフォルトの名無しさん:2007/11/20(火) 12:26:52
10から99までの10進数の数値を1の桁と10の桁に分けたい場合
どうすればいいでしょう?

例えば56を5と6に分けたい場合、どうすればいいのでしょう?
445デフォルトの名無しさん:2007/11/20(火) 12:28:12
56 / 10 → 5
56 % 10 → 6
446デフォルトの名無しさん:2007/11/20(火) 12:36:56
long型なんですが・・・
447デフォルトの名無しさん:2007/11/20(火) 12:37:44
あっ間違えました。ありがとうございました
448デフォルトの名無しさん:2007/11/20(火) 12:48:28
↑のような質問のスレではないので次の質問を書く人は注意
449デフォルトの名無しさん:2007/11/20(火) 15:42:08
>>448
これがゆとり世代と言うもの
450デフォルトの名無しさん:2007/11/23(金) 14:20:32
予約識別子について質問です。
今までは
・下線 _ で始まり英小文字 a-z が続く一般識別子は global namespace で予約済み
というルールから、
type_t function( type_t _parameter ){ return _parameter; };
のような仮引数名は予約識別子ではなかったはず(FAQでも同様の回答)なのですが、
「C99 では Reserved identifiers が『マクロ名を含む』になったから global namespace で #define _paramete されてたら仮引数名も上書きされない?」
と指摘されました。
恥ずかしながら、規格を読んでみても具体的に何が変わったのか私には分かりませんでした。

「今後は避けられるなら避けた方がよい」のは前提として、
既にある _parameter のような仮引数名は今でも安全なのでしょうか?
451デフォルトの名無しさん:2007/11/23(金) 14:33:26
処理系が _parameter というマクロを定義可能になったから、
処理系が _parameter というマクロを定義していた場合に
その引数の _parameter という部分が置き換えられるかもしれない、
という話じゃね。

C99 に対応してないだろう ANSI C/C++ 辞典を見ると、
下線で始まるマクロ名は全て予約識別子らしいから、
今でも問題があるかと。

下線を付ける場合は、普通後ろに1つだけ付ける。
452デフォルトの名無しさん:2007/11/23(金) 15:06:34
>>450
規格の範囲内で問題ないかといえば、問題ない。 >430 にあるように、タグ名を含む
ファイルスコープの識別子として予約されていて、マクロにも使える下線+英大文字とは
区別されている。

ただし、そういう指摘を受けて規格の詳細を見直さないと自信が持てないような
状況を避けるため、はじめから下線始まりの識別子を使わないようにしたほうがいい。
453デフォルトの名無しさん:2007/11/27(火) 15:48:32
C言語ってさ、他のソースに定義してある関数とか引数ちがってmainの中で使ってもコンパイルエラーださないじゃん。

あと、まったく未定義な関数つかっても他のソースにあるかもしれないからとかいう理由でコンパイルエラーだしてくれないじゃん。
とても不便だよね。

なんで、コンパイラはそれくらいのことをしてくれないのかな?別に面倒じゃないと思うんだけど。
454デフォルトの名無しさん:2007/11/27(火) 15:57:06
>>453
大抵のまともなコンパイラなら、(宣言が見つからないと言う理由で)警告を出してくれると思います。
尤も、中にはデフォルトではその警告を出さないコンパイラもありますが。

詳しいことは、それぞれのコンパイラのスレなどでどうぞ。
455デフォルトの名無しさん:2007/11/27(火) 16:03:46
>>453 のような話題のためのスレではないので次の質問を書く人は注意
456453:2007/11/27(火) 16:14:35
>>454 thx 俺のコンパイラがいけんのか。そうか。

やっぱ高いのじゃないとだめだね。なんでも。貧乏人は苦労するよ。

>>455 C言語のコンパイラ全部そうだとおもってたんだよ。俺はトウシロウだから。
457デフォルトの名無しさん:2007/11/27(火) 16:24:38
>>456
ここはコンパイラの使い方のスレではないので程々に。
今無料で利用できるコンパイラの多くが警告を出せると思うので、調べてみてください。
458デフォルトの名無しさん:2007/11/27(火) 16:51:26
gccなら-Wall つけとけ
459デフォルトの名無しさん:2007/11/27(火) 20:47:25
本当はリンカの仕事だからな
460デフォルトの名無しさん:2007/11/28(水) 00:49:19
リンカにその情報は渡らんだろ。渡せるように作れるが。
461デフォルトの名無しさん:2007/11/28(水) 07:14:08
>>460
Cの関数はデフォルトだと内部リンケージだったっけ?
462デフォルトの名無しさん:2007/11/28(水) 10:45:04
いいえ。
463デフォルトの名無しさん:2007/11/28(水) 20:12:34
strcpy と wcscpy のようにアルゴリズムが殆ど同じだが扱う型・定数が微妙に違う関数を同時に実装する必要があるとします。
実装しなければならない数は 2〜3 型 x 30〜40 関数ぐらいとします。

このような場合、

/* strcpy.cpp */
char *strcpy( char *dst_, const char *src_ ) {
char *head = dst_; while( '\0' != (*dst_++ = *src_++) ){ /* nop */; } return head;
}
/* wcscpy.cpp */
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) {
wchar_t *head = dst_; while( L'\0' != (*dst_++ = *src_++) ){ /* nop */; } return head;
}

と一つづつ同じような関数を書いていくのと

/* fallthrough */
464デフォルトの名無しさん:2007/11/28(水) 20:13:12
アルゴリズムだけ書いた

/* template/strcpy.cpp */
#ifdef XCS_IS_CHAR
#define char_t char
#define xcscpy_ strcpy
#define text_( text ) text
#endif

#ifdef XCS_IS_WCHAR
#define char_t wchar_t
#define xcscpy_ wcscpy
#define text_( text ) L ## text
#endif

/* strcpy, wcscpy */
char_t *xcscpy_( char_t *dst_, const char_t *src_ ){
char_t *head = dst_; while( text_('\0') != (*dst_++ = *src_++) ){ /* nop */; } return head;
}

のようなテンプレートを用意して

/* strcpy.cpp */
#define XCS_IS_WCHAR
#include <template/strcpy.cpp>

/* wcscpy.cpp */
#define XCS_IS_CHAR
#include <template/strcpy.cpp>

と読み込ませるので、どちらが良いと思いますか?
あるいは、もっと良い方法がありますか?
465デフォルトの名無しさん:2007/11/28(水) 20:16:38
ちなみに発想は VC++ の crt のソースからです。

>>464 の訂正 /* ファイル名が逆 */

/* strcpy.cpp */
#define XCS_IS_CHAR
#include <template/strcpy.cpp>

/* wcscpy.cpp */
#define XCS_IS_WCHAR
#include <template/strcpy.cpp>
466デフォルトの名無しさん:2007/11/28(水) 20:16:53
C++だったら、C++の関数テンプレート機能を使う方がいい

template<typename T> T *xcscpy( T *dst_, const T *src_ ){
T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head;
};
467デフォルトの名無しさん:2007/11/28(水) 20:21:52
>>466
でもここは残念ながらCのスレ
468デフォルトの名無しさん:2007/11/28(水) 20:50:08
同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが
469デフォルトの名無しさん:2007/11/28(水) 20:52:18
早速の回答ありがとうございます。
共有するヘッダには C++ を使えないことになってますが、私のコードの中だけでも許可が出れば

/* strcpy.cpp */
template<typename T> T *xcscpy( T *dst_, const T *src_ ){
T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head;
};
char *strcpy( char *dst_, const char *src_ ) { return xcscpy( dst_, src_ ); }
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) { return xcscpy( dst_, src_ ); }

/* strcpy.h */
char *strcpy( char *dst_, const char *src_ );
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ );

とは書けますね。
訊いてみます。

ただ、'\0' を 0 としなければならないのが少し気になります。
関数によっては既存の定数や関数を参照しなければならないところもあるので

#define INVALID_INPUTCHARS "*?\"<>|\a\b\t\n\v\f\r" /* 入力禁止文字群 */
#define t_( text ) L ## text
#define xt_( text ) t_( text )
strhoge(){ return strpbrk( test_, INVALID_INPUTCHARS ); }
wcshoge(){ return wcspbrk( test_, xt_( INVALID_INPUTCHARS ) ); }

のような変換も自動で出来ると嬉しいのですが。
470デフォルトの名無しさん:2007/11/28(水) 20:59:13
>>468
ファイルスコープにしてファイルを分ければ可能
471デフォルトの名無しさん:2007/11/28(水) 21:03:42
>>468
>同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが
できますよ、というか出来てます。#undef まで書けば同じファイルにすら実装できます。
下の 2 ファイルを用意して test.cpp をプリプロセッサにかけてみてください。

/* ./template/test.cpp */
#ifdef TYPE_A
#define type_ type_ar
#define name_ func_a
#endif

#ifdef TYPE_B
#define type_ type_b
#define name_ func_b
#endif

type_ *name_( type_ *param );

#undef type_
#undef name_

/* ./test.cpp */
#define TYPE_A
#include "./template/test.cpp"
#undef TYPE_A

#define TYPE_B
#include "./template/test.cpp"
#undef TYPE_B
472デフォルトの名無しさん:2007/11/28(水) 21:10:02
>>471
それでいいならこれでもいいんじゃない?
#include<stdio.h>

#define DEF_SWAP(type) void swap_ ## type(type *a, type *b){type c;c=*a;*a=*b;*b=c;}

DEF_SWAP(int)
DEF_SWAP(char)

int main(void)
{
char val_char[2]={'A', 'B'};
int val_int[2]={1234, 5678};

printf("%c %c\n", val_char[0], val_char[1]);
swap_char(&val_char[0], &val_char[1]);
printf("%c %c\n", val_char[0], val_char[1]);

printf("%d %d\n", val_int[0], val_int[1]);
swap_int(&val_int[0], &val_int[1]);
printf("%d %d\n", val_int[0], val_int[1]);

return 0;
}
473デフォルトの名無しさん:2007/11/28(水) 21:15:40
いつだったかム板のどこかで C 言語で STL ってのを見た記憶がある
もちろんマクロ全開で使いまくりだが、中身を見なければ幸せだった気がする
474デフォルトの名無しさん:2007/11/28(水) 21:20:23
昔こんなんなら書かされた記憶はある。やっつけで再現してみた。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5351.zip
475デフォルトの名無しさん:2007/11/29(木) 01:29:50
476デフォルトの名無しさん:2007/11/29(木) 06:41:15
統合開発環境なににしようか迷っているんですが・・・orz

アドバイスください。。。
477デフォルトの名無しさん:2007/11/29(木) 08:41:56
>>1 読め
478デフォルトの名無しさん:2007/11/29(木) 09:38:48
こんなところにマルチしに来ててワロス
479デフォルトの名無しさん:2007/11/29(木) 11:50:29
・半角アルファベットの文字列を引数をして、文字列に含まれる大文字を
すべて小文字に変換する関数tolower_strを作成せよ
・この関数を用い、入力した半角アルファベットの文字列に含まれる大文字を
すべて小文字に変換し表示するプログラムを作成せよ
コード
#include<stdio.h>

void tolower_str( char []);
int main(void){
char str[256];
printf("文字列を入力して下さい:");
scanf("%s",str);
tolower_str(str);
printf("%s",str);
return 0;
}

void tolower_str(char t[]){
int k;
for (k=0;k!='\0';k++){
if(k>='a' && k<='z'){
k=k+'A'-'a';
}else if (k>='A' && k<='Z'){
k=k+'a'-'A';
}
}
}
実行結果
文字列を入力して下さい:TEST
TEST
変換できないのですtt教えて下さいlol
480デフォルトの名無しさん:2007/11/29(木) 12:07:03
>>479
小文字を変換しようとしてるのはどうして?
まあそれは置いといて、
for (k=0;k!='\0';k++){
ここでkを0に初期化してる(k=0)のに、0だったら抜ける(k!='\0')判定してるから
481デフォルトの名無しさん:2007/11/29(木) 12:08:32
もっと言うと、文字はkじゃなくてt[k]だろ。
482デフォルトの名無しさん:2007/11/29(木) 12:12:48
つーか、宿題スレか初心者スレへどうぞ。
483ニャン:2007/11/30(金) 18:15:48
いくつか聞きたいことがあります


友達が検索エンジンに一括登録するソフトを作ったそうなんですが
ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?

それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません

それから乱数の関数の使い方教えて下さい

あと
画像の表示方も教えて下さい
484デフォルトの名無しさん:2007/11/30(金) 18:18:08
次の患者さんどうぞ
485ニャン:2007/11/30(金) 18:21:03
友達が検索エンジンに一括登録するソフトを作ったそうなんですが
ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?

それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません

それから乱数の関数の使い方教えて下さい

あと
画像の表示方も教えて下さい
486デフォルトの名無しさん:2007/11/30(金) 18:24:22
関連が無いものを複数いっぺんに聞くなよ・・・
あと環境依存のやつはそれなりのスレで。
487デフォルトの名無しさん:2007/11/30(金) 18:28:15
>>483
> ネット上のボタンをクリックしたり コメント枠に書き込んだり
> するのはどうやってプログラムするのですか?

ブラウザがどういう仕組みで動いているのかを調べれば、どうやってプ
ログラムするかもわかるようになるよ。HTTP とか HTML とかね。

488ニャン:2007/11/30(金) 18:28:18
すみません
いろいろ困ってたんで
せめて1番上だけでも答えてください
お願いします
ところで 環境依存ってなんですか?
489ニャン:2007/11/30(金) 18:30:40
ブラウザってどうやって見るのですか?
490ニャン:2007/11/30(金) 18:36:20
俺 コマンドプロンプト内で文字を表示させるくらいまでしか プログラムできないんで
もっと詳しく教えて下さい
491ニャン:2007/11/30(金) 18:45:33
その友達に訊けばいいんじゃないですか。
492デフォルトの名無しさん:2007/11/30(金) 18:48:52
まず >>1 を読め
読み終わったら >>1 を読め

一回休んで、もう一度 >>1 を読め
ついでに >>2 も読んでおけ
493ニャン:2007/11/30(金) 18:49:23
教えてくれないんです
494デフォルトの名無しさん:2007/11/30(金) 19:36:43
これはひどい
495デフォルトの名無しさん:2007/11/30(金) 20:01:15
9,6,4,7,12,14,1,11,10,15,3,5,8,13,2を小さいものから順に並び替える関数です。

0 #include<stdio.h>
1 void quicksort(int x[],int n){
2 int m;
3 int *pa=x+2. *pz=x+n
4 if(n==2){
5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m;
6 return;
7 }
8 while(pa<pz){
9 while(pa<=x+n && *pa<x[1])pa++;
10 while(pz>=x+2 && *pz>=x[1])pz--;
11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m;
12 }
13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m;
14 if(pa-x>2)quicksort(x,pa-1-x);
15 if(x+n-pz>1)quicksort(pz.x+n-pz);
16 }

これの8〜12行目の部分は、9行目で前から数列の6,4,7,12まで進み、
10行目で後ろから2まで進み、12と2を交換するという意味であってますか?



496デフォルトの名無しさん:2007/11/30(金) 20:04:18
>>495ですが、もしかしてスレ違いですか?
497デフォルトの名無しさん:2007/11/30(金) 20:15:03
そうです
次の患者さんどうぞ
498デフォルトの名無しさん:2007/11/30(金) 22:40:30
Cで動的初期化というか、やりたいのは以下のような感じなんだが、
いいアイディアない?

あるヘッダファイルに以下のような定義がある。
typedef const struct ID_ {
  uint32_t a;
  uint8_t bc[2]
} * ID;
extern const ID ID_HOGE;

んで、実体は以下のような感じ。ちなみにID_HOGE_は公開されていない。
static const struct ID_ ID_HOGE_ = {0xaaaa, {0xbb, 0xcc}};
const ID ID_HOGE = &ID_HOGE_;

んで、このIDと名前みたいなヤツの対応を静的に書いておきたい。
struct {
  ID id;
  char *name;
} MAP;
static struct MAP map[]={
  {ID_HOGE,"hoge"},
  ...
};

だが、動的な初期化が出来ないってコンパイラにはじかれてしまう。
どうしたらいい?ボスケテ天才プログラマー。
499デフォルトの名無しさん:2007/11/30(金) 22:47:26
static struct MAP map[]={
  {&ID_HOGE_,"hoge"},
  ...
};
500デフォルトの名無しさん:2007/11/30(金) 22:52:31
>>499
いや、上にも書いたとおり、ID_HOGE_は公開されていなくて、
実体があるソースコードも書き換え不可なんですよ・・・。
501デフォルトの名無しさん:2007/11/30(金) 23:23:44
今日からC言語の勉強を開始しようと思っていますが、初心者でも使いやすい
コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?
502デフォルトの名無しさん:2007/11/30(金) 23:28:12
つ『14歳からはじめるC言語わくわくゲームプログラミング教室』
http://www.amazon.co.jp/gp/product/4899771517/

Borland C++使ってる。
503デフォルトの名無しさん:2007/11/30(金) 23:29:45
>>500
やりたいこと、よくわかんねけどさ。
こうじゃあかんの?

struct MAP{
const ID *id; // <ポインタに
char *name;
};
static struct MAP map[]={
{&ID_HOGE,"hoge"},
};

// 使用例?
int main()
{
printf("%x\r\n", (*map[0].id)->a);
return 0;
}
504デフォルトの名無しさん:2007/11/30(金) 23:39:05
>>502 まだまだ軍資金がないもんで、フリーでできるものを願いします
505デフォルトの名無しさん:2007/11/30(金) 23:42:27
最長共通部分列(LCS)問題について教えてください。

ある座標系が2つ(x1,y1),(x2,y2)が存在して、その座標系に
それぞれ10個の要素があったとします。各要素のx1,もしくはx2座標
とy1,y2座標に重複はないものとします。
要素          1 2 3 10
ex 座標系1・・・(x1,y1)={(4,3),(2,6),(5,9),,,,(10,1)}
座標系2・・・(x2,y2)={(1,5),(7,5),(9,8),,,,(3,4)}

この2つの座標系において要素間の位置関係が等しくなっている全ての要素の
のなかで一番要素数が多いものを割り出す。プログラミングは
どのように組めばいいのでしょうか?よろしく願いします。
506デフォルトの名無しさん:2007/11/30(金) 23:48:20
507デフォルトの名無しさん:2007/12/01(土) 01:34:09
>>498
そのやりかたではできない。
どうせmapは変更しないのだろうから、ID構造体を隠蔽してそのポインタを提供するのではなく
MAP構造体を隠蔽してそのポインタを提供する方式にするんだ。

// id.h
typedef struct{
  uint32_t a;
  uint8_t bc[2]
}ID;
typedef struct{
  const ID *id;
  const char *name;
}MAP_;
typedef const MAP_ * const MAP;
extern MAP map;

// id.c
static ID ID_HOGE_ = {0xaaaa, {0xbb, 0xcc}};
static MAP_ map_[]={
  {&ID_HOGE_,"hoge"},
  ...
};
MAP map=map_;

これでいけるはず
508デフォルトの名無しさん:2007/12/01(土) 02:04:09
>>507
どこがMAPを隠蔽してるんですか?
509デフォルトの名無しさん:2007/12/01(土) 03:12:18
>507
hogeの実体部分のソースは変更不可だってんだからそれは駄目だろ
静的な初期化はあきらめて、mainの頭で初期化するか
map要素を返す関数を用意してそれが最初に呼ばれたときに初期化するかしかないな
510デフォルトの名無しさん:2007/12/01(土) 13:01:43
/* map.h */
ID map_ID(int);
const chat * map_name(int);

/* map.c */
struct {
  ID *id;
  char *name;
} MAP;
static struct MAP map[]={
  {&ID_HOGE,"hoge"},
  ...
};
ID map_ID(int n)
{
const chat * map_name(int n);
511デフォルトの名無しさん:2007/12/01(土) 13:03:25
途中送信しちった

/* map.c */
struct {
  ID *id;
  char *name;
} MAP;
static struct MAP map[]={
  {&ID_HOGE,"hoge"},
  ...
};
ID map_ID(int n)
{
  return *map[n].ID;
}
const chat * map_name(int n)
{
  return map[n].name;
}

これでいいんじゃ?
512デフォルトの名無しさん:2007/12/01(土) 16:10:51
>505
もうちょい正確にやりたいことを書かないと無理だと思うんだな。
何がしたいか正確には分からないけど多分 LCS とは別物だと思う。

>重複はない
座標系1の点 { (x10, y10), ... , (x19,y19) }
座標系2の点 { (x20, y20), ... , (x29,y29) }
で、どう重複がないのよ?i ≠ j なら x1i ≠ x1j って言ってるの?

>要素間の位置関係が等しくなっている全ての要素ののなかで一番要素数が多いもの
座標系1 に対して並行および回転移動を行った際、座標系1の点と座標系2の点とが一致する数が最大となる移動時での
一致する点の組みを選び出せばいいの?
513デフォルトの名無しさん:2007/12/01(土) 17:47:56
スレの趣旨から外れた質問は流せって
514デフォルトの名無しさん:2007/12/01(土) 22:41:50
プリプロセッサってたいがい
#define hoge
って書いてあるけど、インデントやスペースを挟んだ
  # define hoge
みたいな書き方も規格的にOKですか?
515デフォルトの名無しさん:2007/12/01(土) 22:42:09
うん
516デフォルトの名無しさん:2007/12/01(土) 23:16:53
字下げするときはそうすることが多いよNE
517デフォルトの名無しさん:2007/12/01(土) 23:54:57
ありがとうございます。
自信を持ってインデントします。
518デフォルトの名無しさん:2007/12/02(日) 01:45:27
>>511
ポインタのポインタをコンパイラ制限のために、さらにポインタに
するなど受け入れがたいため却下。

IDの比較はどうする?ポインタのポインタのポインタだから、
値を比較するには、ポインタのポインタn・・・とか、
ポインタのポインタが静的に定義されているから、
ポインタのポインタのアドレスで比較すればいいとか、
コピーするにはうんぬんとか。

ヤッテラレッカボケ!
519デフォルトの名無しさん:2007/12/02(日) 01:52:34
可能なら、動的初期化できるC++としてコンパイルすればほぼ498のコードで通る。
これだけのためにそうするのは少々無駄遣いという気もするけど。
520デフォルトの名無しさん:2007/12/02(日) 03:07:50
>518
IDはポインタだからID *はポインタのポインタどまりだろうが
お前はまず教科書読み直せ
521デフォルトの名無しさん:2007/12/02(日) 03:11:31
>>520
アゲアシとってナニが楽しいのかね。そうやって
見下すことでオノレの存在価値を認識する作業を繰り返す
人生なんてオワリにしたほうがいいよ。
522デフォルトの名無しさん:2007/12/02(日) 03:18:59
>>521
こんなところで見下されてる人生なんてオワリにした方がいいよ
523デフォルトの名無しさん:2007/12/02(日) 03:36:44
このあいだ関数プロトタイプ使いたくないとぬかしてたボケと同じ臭いがする
524デフォルトの名無しさん:2007/12/02(日) 10:12:37
>>518
その程度で受け入れ難いなら、まず「C言語を使う」という選択肢を捨てるべき。
C言語しか使えないならC言語の制限は受け入れるしか無いだろ。jk
525デフォルトの名無しさん:2007/12/02(日) 10:34:24
>>524
同意。言語の制限が枷になるなら言語選択からやり直すべき。
526デフォルトの名無しさん:2007/12/02(日) 11:21:12
Dおすすめだにょ!
527デフォルトの名無しさん:2007/12/07(金) 12:25:18
整数型のオーバーフローについて質問です。符合無し型ではラップすると規定されていて、
符号付き型では未定義動作になると理解しました。

その場合、以下のようなコードは「ラップする」と「未定義動作」のどっちになるんでしょうか?

unsigned char c = 1;
c += INT_MAX;

期待する動作としては符号無しのルールに従ってラップした結果が c に残って
欲しいんですが、 c = c + INT_MAX の右辺の c は int (符号付き)に格上げされて
しまうので、未定義動作という解釈もできるように思います。

後者の場合、未定義動作を避けるためには明示的に
c = (unsigned int)c + INT_MAX と書く必要があることになってしまいそうですけど、
ちょっと意味不明なコードになってしまいます。
528デフォルトの名無しさん:2007/12/07(金) 12:38:32
c += (unsigned int)INT_MAX;
529デフォルトの名無しさん:2007/12/07(金) 21:00:23
c = (unsigned char)((unsigned int)c + INT_MAX)

無理して規格の解釈ギリギリのコード書く必要もあるまい。
530デフォルトの名無しさん:2007/12/08(土) 09:39:13
もしかして下線1文字 _ って予約識別子ではない?
531デフォルトの名無しさん:2007/12/08(土) 10:45:41
予約識別子は __func__ だけじゃないかな。
予約マクロにも下線二文字か下線+英字と最低二文字を想定しているっぽいし、
下線一文字は処理系で特別に解釈されるようなことはないと思う。
普通に変数名としても使えるし。
532デフォルトの名無しさん:2007/12/08(土) 11:51:47
下線1文字 _ は
・二重下線を含む
・下線 _ で始まり英数文が続く
どちらのルールにも当てはまらない。
だから「予約識別子ではない」だろうね。

>予約識別子は __func__ だけじゃないかな。
>
>下線一文字は処理系で特別に解釈されるようなことはないと思う。
>普通に変数名としても使えるし。
たとえ予約識別子だろうと "普通に変数名として使える" よ。
"処理系で特別に解釈される" のではなく "処理系が既に使っている可能性がある" 名前。
533デフォルトの名無しさん:2007/12/08(土) 12:06:58
何を以って普通と言うかはわからないが、未定義の動作が伴うことは"普通に変数名として使える"と言えるのか?
処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
処理系依存としか言えない。
534デフォルトの名無しさん:2007/12/08(土) 12:52:31
C99しか見て無いけど。

>>530
ファイルスコープは予約されてるっぽい。

>>531
マクロ名も識別子らしい。

自分から進んで規格見ないから勉強になるわぁ。

C89はシラネ。
どっかで見れないかね?
お取り寄せメンドイ。
535デフォルトの名無しさん:2007/12/08(土) 13:17:21
>>530
_ はC89の頃から大域名前空間では予約済み。

>処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
というか、処理系は予約識別子も予約されていない識別子も同様に扱う。
名前の上書きが問題になるのは識別子が予約されているかどうかとは別の問題。
例えば

char hoge[]="hoge";
…………
hoge[10] = '\0';

ってコードは言うまでもなく未定義で正しくないコードだが、
それでも "普通に書ける" コードではあろう。
536デフォルトの名無しさん:2007/12/08(土) 13:19:43
"普通"の定義によるんじゃない?
コンパイルが通るだけで普通なのかってことになるだろ
537デフォルトの名無しさん:2007/12/08(土) 13:37:38
そこはコンパイラの説明書を読めとしか。
538デフォルトの名無しさん:2007/12/08(土) 14:50:48
イマサラだけど「普通」って文化の問題だから、
規格と比べて云々しても答え出ないっしょ。

肯定も否定もでけまへん。
539デフォルトの名無しさん:2007/12/08(土) 15:36:42
根本的に間違ってる。
コンパイルできるかどうかも処理系依存だということを忘れてる。

よって処理系に依存しない書き方が普通。
540デフォルトの名無しさん:2007/12/08(土) 16:06:01
C89のコードが普通のところもあれば
C99のコードが普通のところもあれば
gcc依存のコードが普通なところもあれば

言えばキリが無いよ。
何が普通かなんて、語るだけナンセンス。
541デフォルトの名無しさん:2007/12/08(土) 16:30:37
このスレでは普通についての議論はしません
542デフォルトの名無しさん:2007/12/08(土) 16:33:40
予約識別子を予約されていない識別子と同様に扱うことが普通かどうかって話だろ?
とりあえず避けるわな、普通。
543デフォルトの名無しさん:2007/12/08(土) 16:59:17
・赤信号だろうが普通に渡ることはできる。だが普通は渡らない。
・予約識別子は普通に変数名として使える。だが普通は使わない。

どっちも正しい。
二人とも普通の指してる先が違うんだ。
それに気づかなきゃ話が噛み合うわけがない。
544デフォルトの名無しさん:2007/12/08(土) 17:01:06
予約識別子を普通に扱うってのはコンパイラが?プログラマが?
545デフォルトの名無しさん:2007/12/08(土) 17:41:55
>>543
例え話に例え話で返すと話がズレがちなんで嫌なんだが、ちょっと言いたい。

>赤信号だろうが普通に渡ることはできる
規約違反。

精々「横断歩道の無い道を渡る」ぐらいのものだと思う。
車線無しならOK、対向1車線でもまぁ、対向2車線・・・うーん。
という感じで、程度問題ではなかろーか。
546デフォルトの名無しさん:2007/12/08(土) 18:07:53
本筋とズレたところで例え話の粗探ししてどうすんの。
そういう話じゃねえべ。
547デフォルトの名無しさん:2007/12/08(土) 18:25:32
細かい所に拘りたいのも本質さえ掴めれば良しとするのも人それぞれ。
何が普通かと同じで結論は出ません。
548デフォルトの名無しさん:2007/12/08(土) 18:33:52
コンパイルできるのは処理系依存だってことはみんな理解して発言してるんだよな?
549543:2007/12/08(土) 21:47:05
予約識別子は constraint ではないのでCのコードとしては "普通" に使える識別子である。 <= 文法上の問題
ただし、そのようなコードをコンパイルする場合については undefined である。 <= 意味上の問題
だから、そういう書き方は "普通" はしない。 <= 道徳上の問題

「使えない」のか「使ってはいけない」のか「使わない」のかでは全く意味が違う。
だから話が噛み合っていない。
550デフォルトの名無しさん:2007/12/08(土) 21:51:40
道徳というより実作業上の問題じゃね?
551543:2007/12/08(土) 21:55:55
>道徳というより実作業上の問題じゃね?
ん、そっちの方が適当だね。
552543:2007/12/08(土) 22:09:08
あと「誰が」普通に扱うのかっていう主語の混乱もあるな。
俺的に分類してみた。

>>531 ?? (主語:プログラマが)
>>532 文法 (主語:処理系が)
>>533 意味 (主語:???)
>>535 文法 (主語:処理系が)
>>539 意味+作業 (主語:プログラマが)
>>540 文化 (主語:プログラマが)
>>542 作業 (主語:プログラマが)
>>548 意味 (主語:???)
553デフォルトの名無しさん:2007/12/08(土) 22:42:44
>>549
話が噛み合ってないとか以前に、自分の発言の意味を自分自身理解してるのか?
傍目にはお前が一番混乱してるぞ。 電波撒き散らすな。
554デフォルトの名無しさん:2007/12/09(日) 03:07:37
>>553>>549の何が気に入らないんだ?
真っ当な指摘だと思うがね。
555デフォルトの名無しさん:2007/12/09(日) 11:12:45
さあこんなことを言われてしまった>>553は何がどうどういった根拠で
>>549が混乱しているのか詳しく説明するか、逃げるかふたつにひとつになってしまいました
556デフォルトの名無しさん:2007/12/17(月) 04:56:43
なんで、mallocは1引数関数なのにcallocは2引数なんでしょうか?
557デフォルトの名無しさん:2007/12/17(月) 09:43:27
>>556
calloc()を1引数にしたら存在意義がほとんどないじゃないか。
558デフォルトの名無しさん:2007/12/17(月) 11:18:15
ゼロクリア
559デフォルトの名無しさん:2007/12/17(月) 11:23:22
柳家calloc
560デフォルトの名無しさん:2007/12/17(月) 16:12:57
callocは要らない子
561デフォルトの名無しさん:2007/12/17(月) 16:42:51
>>557
なんで?
562デフォルトの名無しさん:2007/12/18(火) 03:45:39
mallocで確保したメモリを、100x200の2次元配列だとおもってa[m][n]のようにアクセスしたいので、
    int* p = (int*)malloc(100*200*sizeof(int));
...
    typedef int A[100][200];
    A* a = (A*)p;    
のようなコードを書いたのですが、これだと使うときに(*a)[0][0]のように*が必要になってしまいます。
どうにか、*を使わずにa[0][0]のように書く方法はないでしょうか。

C++はNGです。
563デフォルトの名無しさん:2007/12/18(火) 03:56:03
>>562
int (*a)[200] = (int (*)[200])malloc(sizeof(int[200]) * 100);

typedef int A[200];
A* a = (A*)malloc(sizeof(A) * 100);
564デフォルトの名無しさん:2007/12/18(火) 08:57:51
int (*a)[200] = malloc(sizeof(int[200]) * 100);
これでいい
565デフォルトの名無しさん:2007/12/19(水) 23:21:25
VC++のstrstr系関数って、KMP法とかBM法で実装されてるんでしょうか?
それと、もし自分で実装するとしたらですが、KMPとBMのどちらが評判よいですか?
566デフォルトの名無しさん:2007/12/19(水) 23:35:28
お帰りください
567デフォルトの名無しさん:2007/12/19(水) 23:44:40
たぶんそんなのは使っていないと思う。
あまりにも短い文字列などだとかえって時間かかるから。
568デフォルトの名無しさん:2007/12/20(木) 02:59:48
絶対使ってない、と言い切れるね。

1回しか使わない探索にテーブルのセットアップとかが無駄と言うのもあるけど
そもそも、そういうスキップする(全文字走査しない)アルゴリズムは
テキストの長さがあらかじめ判ってないと使えない。
そして、(strstrに渡す)文字列の長さをstrlenで調べてからBM法を使うくらいなら
長さを求める'\0'探しのついでに力任せ探索をするほうがずっとまし。
たとえ同じ文字列を何回も探索するような、初期化が必要ないケースでも。
569デフォルトの名無しさん:2007/12/21(金) 00:21:03
ビット操作の練習をしています。符号あり2の補数表現の整数の符号を反転するコードは、
x=(~x)+1;とx=~(x-1);のどちらが適切でしょうか?
570デフォルトの名無しさん:2007/12/21(金) 01:38:53
x=-x;
>>569
x *= -1;
572デフォルトの名無しさん:2007/12/21(金) 04:13:19
このスレ的には2の補数表現を仮定してる時点で間違い
573デフォルトの名無しさん:2007/12/21(金) 09:58:35
>>572 は誰に言ってるのか
574デフォルトの名無しさん:2007/12/21(金) 10:09:03
>>573
>>570-571ではなかろうか
575デフォルトの名無しさん:2007/12/21(金) 10:12:04
俺は>>569だと思った
576デフォルトの名無しさん:2007/12/21(金) 11:02:23
>>569
xがunsignedならどっちも同じになるから、どっちでもいいよ。
577デフォルトの名無しさん:2007/12/21(金) 11:52:01
>>576 符号ありと書いてあるが。
578デフォルトの名無しさん:2007/12/21(金) 11:56:24
んー微妙だなw
579デフォルトの名無しさん:2007/12/21(金) 13:00:08
構造体の定義で、たまに
struct X {
 ...
 char tag[1];
}
とか書いてあるものがありますが([0]の場合もあり)、これは何でしょうか?
580デフォルトの名無しさん:2007/12/21(金) 13:08:33
581デフォルトの名無しさん:2007/12/21(金) 13:11:49
C FAQ 次スレからテンプレに入れよう
582デフォルトの名無しさん:2007/12/21(金) 13:13:08
>>581
>>1にあるだろ。テンプレ嫁
583デフォルトの名無しさん:2007/12/21(金) 13:15:32
あ、見落とした m(__

しかし、それが何であるかの説明にはなってないなw
しかしこのスレではスレ違いなので、
スレ立てるまでもない質問のほうに答えは書いておく。
584デフォルトの名無しさん:2007/12/21(金) 13:57:03
どうせ規格の話になるんだし、ここで答えてもよかっただろうに。
分散して見づらくなる。
585デフォルトの名無しさん:2007/12/21(金) 14:23:06
心得の意味がわかってないやつがいるなぁ
「わざとスレ違いな質問をする荒らしがいるのでそういうのは無視するか軽く流してください」
次からこう書かなきゃダメか?
586デフォルトの名無しさん:2007/12/21(金) 14:34:52
何でスレ違いなのか、さっぱりわからない
587デフォルトの名無しさん:2007/12/21(金) 14:42:27
>586
どの質問についての話なのかさっぱりわからない
>579についてのことなら、プログラム技法の質問であって規格の質問ではないからだ
588デフォルトの名無しさん:2007/12/21(金) 14:43:51
え、いつからこのスレは規格オンリーなスレになったんだ?
589デフォルトの名無しさん:2007/12/21(金) 14:43:54
何でしょうかって聞かれたらそれは
要素数が1のcharの配列です
としか答えられんよな
590デフォルトの名無しさん:2007/12/21(金) 14:44:56
>>587
規格に準拠したC言語に関するスレであって、規格のスレではなかったはずだが。
591デフォルトの名無しさん:2007/12/21(金) 14:45:53
だから>>579に対する答えは>>589で終わりだ
592デフォルトの名無しさん:2007/12/21(金) 14:46:23
>>2
593デフォルトの名無しさん:2007/12/21(金) 14:47:40
>>587みたいなキチガイが湧くから>>2の注意書きがあるってのに…
594デフォルトの名無しさん:2007/12/21(金) 14:49:45
なんなの、この自治厨
595デフォルトの名無しさん:2007/12/21(金) 14:51:46
なぜ「だから」なのか、さっぱりわからない
596デフォルトの名無しさん:2007/12/21(金) 15:03:45
ざっとこのスレ見直したけど、いかにも>>587の気に食わなさそうな話題がたくさん見逃されてるよ。
何故?
597デフォルトの名無しさん:2007/12/21(金) 15:05:58
なんかいろいろ言われてるけど
http://pc11.2ch.net/test/read.cgi/tech/1196509846/552
結局なぜ、こういう使いかたをするのかわからない
598デフォルトの名無しさん:2007/12/21(金) 15:08:10
>>597
向こうで聞け
599デフォルトの名無しさん:2007/12/21(金) 15:17:17
この書き方が文法的に正しいかも移植性が高いのかもともにはっきりしない。ただし、かなり幅広く使われている。この技法による実装は以下のようになる。

#include <stdlib.h>
#include <stdio.h>

struct name *makename(char *newname)
{
  struct name *ret
    =malloc(sizeof(struct name)-1 + strlen(newname)+1);
      /* -1 は頭の [1] 用; +1 は \0 用 */
  if(ret!=NULL){
    ret->namelen = strlen(newname);
    strcpy(ret->namestr, newname);
  }

  return ret;
}

上の関数は、name 構造体の実体を、引数で要求された名前を保持できるように(構造体の定義から想像する1文字ではなく)大きさを調整して割り付ける。
幅広く使われているけれど、この技はいささか悪名高い。……

以上、CFAQ初版より抜粋
600デフォルトの名無しさん:2007/12/21(金) 16:48:26
なんで、
struct name {
 int namelen;
 char *namestr;
};
にしないんだろう?二回malloc/freeするのがイヤってことなのかな。
601デフォルトの名無しさん:2007/12/21(金) 16:58:54
ファイルの入出力も1回で済んだしな
602デフォルトの名無しさん:2007/12/21(金) 17:05:11
>>600
そのまま通信用バッファとかに使えるから、流行ってたんだと思う。
603デフォルトの名無しさん:2007/12/21(金) 17:21:32

CG法のプログラムを完成させ、以下のA,bに対する解xを求めよ。
A:

-6.761582e-01 8.649824e-01 5.974179e-01 1.510212e-01 9.412452e-01
8.649824e-01 -9.466491e-01 9.172758e-02 9.491567e-02 3.673389e-01
5.974179e-01 9.172758e-02 8.015639e-01 -7.419281e-01 2.099383e-03
1.510212e-01 9.491567e-02 -7.419281e-01 -2.940182e-01 -6.722990e-01
9.412452e-01 3.673389e-01 2.099383e-03 -6.722990e-01 -8.416333e-01

b:

8.156371e+00
1.463224e+00
2.283493e-01
-6.422500e+00
-5.215142e+00

これってどうやったらできるんですかね?(>。<)
cg法自体よくわかってないんですが…
604デフォルトの名無しさん:2007/12/21(金) 17:22:17
これこそ、正にスレ違いだな。
605デフォルトの名無しさん:2007/12/21(金) 17:26:04
連立方程式の開放の一つだろ
606デフォルトの名無しさん:2007/12/21(金) 17:35:03
607デフォルトの名無しさん:2007/12/21(金) 17:38:06
Lesson6 連立方程式-大規模疎行列-(不完全Colesky分解)

Lesson7 連立方程式-大規模疎行列(前処理つきICG法)

http://www.saitama-u.ac.jp/hiyama/suchi2.htm
608597:2007/12/21(金) 17:44:58
>>599
なるほどーよくわかりました。
やっぱり、>>600のように書いたほうがいいですね。
609デフォルトの名無しさん:2007/12/21(金) 17:45:59
共益勾配法のことか。
なつかしー。BCG法とかもやらされたなあ・・・
610デフォルトの名無しさん:2007/12/21(金) 19:49:22
処理系依存の話ではなくANSI Cとしての話ですが、

シフト演算で、シフト量が0の場合の挙動は定義されているのかな?
それとも未定義?

int x;

x>>= 0:

x<<=0;

とかした場合
611デフォルトの名無しさん:2007/12/21(金) 19:53:12
変化無し
612610:2007/12/21(金) 20:16:42
>>611
どもです。

ANSI C ( JISX3010)
http://www.jisc.go.jp/

をぱらぱら読んでみましたが、

 6.5.7 ビット単位のシフト演算子

を読む限り、負数の場合は未定義とはありますが、0に関しては
特に述べられてませんね。

どの処理系でも

(x >>= 0) == x

(x <<= 0) == x

と想定してFA?
613デフォルトの名無しさん:2007/12/21(金) 20:22:21
c<<(m-n)
という式ではm-n=0という場合もある
614デフォルトの名無しさん:2007/12/21(金) 23:50:39
>612
x >= 0 ならね。厳密に解釈するなら x < 0 なら << は未定義、>> は処理系定義。
615610:2007/12/23(日) 23:40:58
>>614
どうもです。でしたらunsigned int なら大丈夫ですね。
616デフォルトの名無しさん:2007/12/23(日) 23:54:53
>>599あたりの話なんですが、
なぜこの技法はだめなんですか?
特に問題なさそうに思えるんですが
617デフォルトの名無しさん:2007/12/23(日) 23:59:05
C89の規格に「やってもよい」と明記はされてないから。C99なら問題ない。
618デフォルトの名無しさん:2007/12/24(月) 00:03:12
規格を厳密に解釈すると、駄目ということになるから。
http://www.kouno.jp/home/c_faq/c2.html#6
619デフォルトの名無しさん:2007/12/24(月) 00:14:46
Windowsもbitmap周りでやってたな
620デフォルトの名無しさん:2007/12/24(月) 09:56:51
C99 ならサイズ無しで書いとけば可変長メンバが使えるようになったね。
621デフォルトの名無しさん:2007/12/24(月) 10:19:28
>>617
ahosugi
622デフォルトの名無しさん:2007/12/24(月) 10:21:23
>>620
なんで何度も出てることを新しい情報のように紹介してくれるの?
623デフォルトの名無しさん:2007/12/24(月) 10:32:47
安部さんが首相を辞任したね
624デフォルトの名無しさん:2007/12/24(月) 10:47:43
中日ドラゴンズが日本一になったね
625デフォルトの名無しさん:2007/12/24(月) 10:53:53
C99対応のコンパイラってGCCぐらいかな?
626デフォルトの名無しさん:2007/12/24(月) 10:55:47
GCCがC99に対応したね
627デフォルトの名無しさん:2007/12/24(月) 10:56:34
そう。でもGCCでも完璧に対応してるわけじゃないけどね。
ttp://gcc.gnu.org/c99status.html
628デフォルトの名無しさん:2007/12/24(月) 11:09:16
DMCをお忘れではありませんか。
こっちも完璧ではないけどね。
629デフォルトの名無しさん:2007/12/24(月) 11:12:56
VCも少しは見習え
630デフォルトの名無しさん:2007/12/24(月) 11:48:35
数年前のC99をいまだ対応させないコンパイラって・・・
昔との互換性?それとも技術的に改良部分が多いのか?難しいのか?
よくわからないけど
631デフォルトの名無しさん:2007/12/24(月) 11:50:12
そりゃC99に対応させても努力が多いわりに実入りが少ないなら
当然じゃない?ビジネス的にはC++かC#を使ってってこと。
632デフォルトの名無しさん:2007/12/24(月) 13:02:19
iccはc99だし、SunWorksのccもc99だけどね。
633デフォルトの名無しさん:2007/12/24(月) 13:20:11
>>629
620は、少なくともVC++ 7.1以上なら独自拡張扱いで使える。
http://msdn2.microsoft.com/en-us/library/34h23df8(VS.71).aspx
634デフォルトの名無しさん:2007/12/24(月) 21:17:49
fread関数でサーバーにあるファイル(ファイルサイズ1G)を読む際、
読込みサイズを32*1024*1024にするとエラーがおきなくて、
読込みサイズをファイルサイズにするとエラーが起きるのはどうしてでしょうか

どなたかご教授下さいm(_願_)m
635デフォルトの名無しさん:2007/12/24(月) 21:21:44
そんなに大量のメモリをいっぺんに確保できていないのだろう。
636デフォルトの名無しさん:2007/12/24(月) 21:23:47
エラーってなんだよ
637デフォルトの名無しさん:2007/12/24(月) 22:07:40
634です。

スレ違いでした。失礼しました。
638デフォルトの名無しさん:2007/12/25(火) 00:36:13
規格の話以外はスレ違いだと騒ぐのに、コンパイラの話になると嬉々として話題に加わる
639デフォルトの名無しさん:2007/12/25(火) 00:49:57
>>638
なんでそう必死なんだ。
640デフォルトの名無しさん:2007/12/25(火) 00:52:13
コンパイラの規格準拠度なんて、まさにこのスレの守備範囲だろ。
641デフォルトの名無しさん:2007/12/25(火) 21:23:25
実装に特化したスレってあったっけ?
642デフォルトの名無しさん:2007/12/25(火) 21:23:58
↑「実装すること」に特化した
643デフォルトの名無しさん:2007/12/25(火) 21:27:32
「コンパイラ・スクリプトエンジン」相談室12
http://pc11.2ch.net/test/read.cgi/tech/1188688416/

とかか?
644デフォルトの名無しさん:2007/12/26(水) 11:27:29
このスレは規格厨の隔離スレだから、何でもありなんだよ
645デフォルトの名無しさん:2007/12/26(水) 12:12:57
必死すぎて笑えない
646デフォルトの名無しさん:2007/12/27(木) 09:54:11
647デフォルトの名無しさん:2007/12/27(木) 17:49:56
質問と言うより、わからなくててずまりしていますので助けてください。
LEDでC言語を使ってブロック崩しを作っているのですが、何をどう打てばいいのかわからなくなってしまったので助けてください。

void my_rcket_put(char x, char y) //自分のrcketをvramに書き込む
{
led_dot (x, y, 1);
led_dot (x+1, y, 1);
led_dot (x+2, y, 1);
}

void my_rcket_clr(char x, char y) //自分のrcketをvramから消す
{
led_dot (x, y, 0);
led_dot (x+1, y, 0);
led_dot (x+2, y, 0);
}
void rcket_move(void)
{
my_rcket_clr (rcket_x, rcket_y);
if (key_left == 1) {
rcket_x--;
key_left = 0 ;
}
if (key_right == 1) {
rcket_x++;
key_right = 0 ;
}
my_rcket_put (rcket_x, rcket_y);
}

rcketが、更新されなくて消えない
648デフォルトの名無しさん:2007/12/27(木) 17:52:07
スレ違い
649デフォルトの名無しさん:2007/12/27(木) 18:08:32
>>647
ここは標準Cについて語る・質問するスレなので他へどうぞ
650デフォルトの名無しさん:2007/12/27(木) 18:09:35
×てずまり
○手詰まり(てづまり)
651デフォルトの名無しさん:2007/12/27(木) 18:35:44
無理ですか?
652デフォルトの名無しさん:2007/12/27(木) 18:38:57
>>651
日本語の質問は鼬害です。
653デフォルトの名無しさん:2007/12/27(木) 18:46:24
Cについて聞いてるつもりなのだが・・・
654デフォルトの名無しさん:2007/12/27(木) 18:52:17
>>653
>649
655デフォルトの名無しさん:2007/12/27(木) 18:55:47
>>647
ソースの断片だけ載せて何の説明もなしって馬鹿ですか?
初心者スレかエスパースレ、或いはゲ製板で改めて最初からどうぞ。
656デフォルトの名無しさん:2007/12/27(木) 19:11:01
#include <3664.h>
#include<stdlib.h>
#include "vram.h"
#include "vram.c"

#define CLOCK IO.PDR5.BIT.B3
#define LATCH IO.PDR5.BIT.B4
#define DATA IO.PDR5.BIT.B1

#define SW_UP IO.PDR8.BIT.B3
#define SW_DOWN IO.PDR8.BIT.B2
#define SW_RIGHT IO.PDR8.BIT.B5
#define SW_LEFT IO.PDR8.BIT.B0
#define SW_SHOT IO.PDR8.BIT.B1

char block_bx[6]; //ブロックの座標の保持
char block_by[6];
char speed; //game speed
int score;
char block_count; //ブロックの背番号
char rcket_x, rcket_y; //ラケットの座標
char voll_x, voll_y; //ラケットからのボールの座標
657デフォルトの名無しさん:2007/12/27(木) 19:11:25
char key_up = 0, key_down = 0, key_right = 0, key_left = 0, key_shot = 0;

void my_rcket_put(char x, char y) //自分のrcketをvramに書き込む
{
led_dot (x, y, 1);
led_dot (x+1, y, 1);
led_dot (x+2, y, 1);
}

void my_rcket_clr(char x, char y) //自分のrcketをvramから消す
{
led_dot (x, y, 0);
led_dot (x+1, y, 0);
led_dot (x+2, y, 0);
}

void block_put(char bx,char by) //vlokeをvramに書き込む
{
led_dot (bx, by, 1);
}

void block_clr (char bx, char by)
{
led_dot (bx, by, 0);
}
658デフォルトの名無しさん:2007/12/27(木) 19:11:47
void block_init(void)
{
int i;

for (i = 0; i < 6/* ブロックの数*/; i++) {
block_bx[i] = (i % 3) * 4;
block_by[i] = 14 - (i / 3) * 4;
}

block_count = 6;
}
659デフォルトの名無しさん:2007/12/27(木) 19:12:23
void voll_move(void)
{
int i;

if (voll_y != -1) {
voll_y++;
voll_x++;
for (i = 0; i < 6; i++) {
if (block_by[i] == -1)
continue;
//命中
if ((voll_y == block_by[i]) && (voll_x >= block_bx[i]) && (voll_x <= (block_bx[i] +2))) {
block_clr(block_bx[i], block_by[i]) ;
score++;
if (score > 9999)
score = 9999 ;
speed -= 2;
if (speed < 3)
speed = 3;
voll_y = -1;
block_by[i] = -1;
block_count--;
if (block_count == 0) {
block_init();
speed += 8;
}
break;
}
}
660デフォルトの名無しさん:2007/12/27(木) 19:12:47
(´・∀・`)
661デフォルトの名無しさん:2007/12/27(木) 19:12:58
led_dot (voll_x, voll_y, 1);
} else {
if (key_shot == 1) { //push shot button
voll_x = rcket_x + 1;
voll_y = rcket_y;
key_shot = 0;
}
}
}
662デフォルトの名無しさん:2007/12/27(木) 19:13:48
>>656
日本語は読めますか?
Can you read Japanese?
663デフォルトの名無しさん:2007/12/27(木) 19:18:20
>>661
現在連投規制中? 何を指摘されているのかホントに判らんのかな。
664デフォルトの名無しさん:2007/12/27(木) 19:21:15
高校の先生が説明不十分で何したらいいかわからない常態なんです
665デフォルトの名無しさん:2007/12/27(木) 19:34:00
>>664
それが「常態」なら、赤点とっておけばいいと思うよ。
666デフォルトの名無しさん:2007/12/27(木) 19:34:39
実習でできなかったら留年
667デフォルトの名無しさん:2007/12/27(木) 19:35:06
完成しなかったら
668デフォルトの名無しさん:2007/12/27(木) 19:42:00
何この説明力の無さ
669デフォルトの名無しさん:2007/12/27(木) 20:01:27
>653
led_dot()はC標準の関数ではありません
よってあなたのソースはこのスレの取り扱い範囲外です
670デフォルトの名無しさん:2007/12/27(木) 21:22:03
一言ですむ話だろ。

スレ違い
671デフォルトの名無しさん:2007/12/28(金) 10:53:52
>>670
>648
672デフォルトの名無しさん:2007/12/28(金) 22:33:52
無視すりゃいいのにー
673デフォルトの名無しさん:2007/12/29(土) 00:06:03
#pragma section test rom
のように記述すると'('がありません、といった警告が出る理由がわからないのですが、
正しい記述を教えて頂けませんか?
#pragma section (test, "rom") のような記述もあったと思うのですが違いが
さっぱりわからんのです
674デフォルトの名無しさん:2007/12/29(土) 00:18:37
標準Cにsectionプラグマは存在しません。
675デフォルトの名無しさん:2007/12/29(土) 00:19:47
>>673
pragmaの構文は実装依存です。従って、スレ違いですので該当スレでどうぞ。
676デフォルトの名無しさん:2007/12/29(土) 01:17:55
C99 で1つだけ共通のプラグマが追加されたような気がするお。
section じゃないけどな。
677:2007/12/30(日) 13:21:07
すいません 教えてください
コマンドライン引数を使いたいんですが
「新規作成.txt」をExeに放り込んだときにprintf()で確認したところ
C:\デスクトップ\新規作成.txtの部分を、新規作成.txtだけ抜き取りたい場合は
どうしたらいいんですか?
678デフォルトの名無しさん:2007/12/30(日) 13:22:23
¥を調べればいいじゃん
679デフォルトの名無しさん:2007/12/30(日) 14:19:27
strrchr
680デフォルトの名無しさん:2007/12/30(日) 14:25:40
>>677
\を後ろから調べて\の次
681デフォルトの名無しさん:2007/12/30(日) 18:45:42
C言語の知識のみでテトリスは作れますか?
682デフォルトの名無しさん:2007/12/30(日) 19:04:33
無理
683デフォルトの名無しさん:2007/12/30(日) 19:06:44
CUIの範囲なら余裕だろうが
684デフォルトの名無しさん:2007/12/30(日) 19:20:07
標準関数のみではリアルタイム入力ができません
685デフォルトの名無しさん:2007/12/30(日) 19:44:49
>>684
テラカワイソス(´・ω・`)
686デフォルトの名無しさん:2007/12/30(日) 19:45:37
そもそも、「C言語の知識のみ」ってどこまでなんだろう。
少なくとも、「テトリス」の知識がなければ作れないこと位いくらなんでも>681でも判っているだろうし。
687デフォルトの名無しさん:2007/12/31(月) 01:48:37
いずれにしろスレ違いすぐる
688デフォルトの名無しさん:2008/01/02(水) 18:17:07
>>685
なんか変なこと言ったか?
http://www.kouno.jp/home/c_faq/c19.html#0
689デフォルトの名無しさん:2008/01/02(水) 18:18:43
標準関数しか使えないからかわいそうなんだろう
690デフォルトの名無しさん:2008/01/02(水) 18:21:11
だってそういうスレだし
691デフォルトの名無しさん:2008/01/02(水) 20:22:05
リアルタイム入力じゃないか?
エンター押せばいいんだし。
692デフォルトの名無しさん:2008/01/02(水) 20:54:35
どのみちテトリスは無理無理
明らかに聞くスレ間違ってるだろ
693440:2008/01/02(水) 21:42:38
>>681
テトリスはエスケープシーケンスの色を使って
emacsのテトリス風にすれば作れるかもしれませんね
落下するにはsleepとかで時間の間をあけたり使ったりするんすかね?
凄いテトリスって難しそうですが
694デフォルトの名無しさん:2008/01/02(水) 21:44:30
>>440
スレ間違えてないか?
695デフォルトの名無しさん:2008/01/02(水) 21:46:22
>>693
Cにsleepなんかないし、エスケープシーケンスなんかも定義されてない。
要するにあなたの質問は完全にスレ違いです。
696デフォルトの名無しさん:2008/01/02(水) 22:09:13
ここは "標準C" についてのスレです.C言語一般についての質問は他のスレへどうぞ
697デフォルトの名無しさん:2008/01/03(木) 22:17:07
マクロで
#define a b
#define b( x ) b( x, 0 )

a( a )

b( b, 0 )
にできることは定められていますか?

特に
・展開された字句が自分自身に一致することは安全か?
・大概のプリプロセッサが a と a() を別物として扱うのは規格化された動作か共通の拡張か?
・定数型マクロとして展開された字句が関数型マクロと一致した場合に再び置換されることが保証されているか?
について教えてください
698デフォルトの名無しさん:2008/01/03(木) 22:34:55
b( b, 〜の使い道がわからないおいらはヘタレ
関数の引数に関数を渡すの?
699デフォルトの名無しさん:2008/01/03(木) 22:57:01
えーと。とあるドキュメントから転載
> (略)ANSI が新しく採
> 用したルールとして、あるマクロがひとたび展開された場合には、展開後
> のトークン列に同じマクロの呼び出しであると解釈できる部分があっても、
> もはやそのマクロは展開しないことになっているのです(略)
> (略)ANSI の規定では、この展
> 開抑制は、複数のマクロにまたがって有効でなければならないとされてい
> ます。

仕様書を持ってないのでこれ以上は誰かにパス
700デフォルトの名無しさん:2008/01/03(木) 23:14:50
>>697
> ・展開された字句が自分自身に一致することは安全か?
基本的には文字列置き換えなので
#define X X
X --> X

こう言うのは危険
#define X(X, y) X(X, y)
X(0, 1) --> 0(0, 1)

> ・大概のプリプロセッサが a と a() を別物として扱うのは規格化された動作か共通の拡張か?

言ってることの意味が良く分からないんだが

> ・定数型マクロとして展開された字句が関数型マクロと一致した場合に再び置換されることが保証されているか?

展開する構文要素がなくなるまで再帰的に機能するから保証されてると思う

JIS くらいしか, 簡単に online で閲覧できる規格思いつかないんで

http://www.jisc.go.jp/app/JPS/JPSO0020.html

で "JIS規格番号からJISを検索" に, X3010 を入力して, 規格表引っ張ってきて,

"6.10.3 マクロ置き換え(pp. 114-)"

の項を見てくれ.
# 英文の ISO の規格の方が読みやすい気もするが...
701デフォルトの名無しさん:2008/01/04(金) 02:39:52
翻訳してる人も仕事だから仕方ないけど
規格は無料で読ませてほしいよな
702デフォルトの名無しさん:2008/01/04(金) 08:26:09
仕様:
1. UNIXのcronみたいに特定の時間になるとある処理を実行させる
2. そのプログラム自体はdaemonとしてずっと走り続けている

こういうことをLinux上でやりたいんですが、
sleepかalertを使って、
希望の時間になったかを調べ続けるしかないですかね。
何か普通はこうやるよってのあります?

1分に1回温度を測定するプログラムです。
703デフォルトの名無しさん:2008/01/04(金) 09:33:49
>>702
標準Cではできないので、unixプログラミングスレなどの該当スレへどうぞ。
704702:2008/01/04(金) 10:48:21
>>703
引っ越します。

【初心者歓迎】C/C++室 Ver.46【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1198755167/
705デフォルトの名無しさん:2008/01/04(金) 22:52:43
> a と a() を別物として扱う
私の知る限りのコンパイラでは

#define a(x) b(x)
a(x) => b(x)
a(x,y) => エラー:引数の数がわない
(a)(x) => (a)(x) のまま

となっているのが規格で規定された動作なのか、ということでした。
>>http://www.jisc.go.jp/app/JPS/JPSO0020.html
を読んでみても、それらしいことが書いてないような気がするので処理系定義か未規定かもしれません。
706デフォルトの名無しさん:2008/01/05(土) 01:46:04
処理系定義か未規定ならそうである旨が明記されているはず
707デフォルトの名無しさん:2008/01/05(土) 02:17:49
>>705
規格によると、
* マクロaが定義されてるとき、マクロa()を再定義することは出来ない。その逆もできない。
* マクロaが定義されてるとき、識別子aは置換される。
* マクロa()が定義されてるとき、識別子aの後に(が現れる並びがあれば、対応する)まで置換される。

これらから、
* マクロaとマクロa()が同時に定義されていることはない。
* マクロaが定義されているとき、a()の並びは置換される。
* マクロa()が定義されているとき、(a)()の並びは置換されない。
が導出できると思う。
708デフォルトの名無しさん:2008/01/05(土) 02:31:10
>>706
おま、すごくやさしいな
709デフォルトの名無しさん:2008/01/06(日) 00:43:58
固定長配列ではない a = malloc( NUM * sizeof( *a ) ) に対して &a[0] < &a[ NUM ] /* NUM-1 ではない */ は保証されていますか?
また、異なる2つのオブジェクトを指すポインタの比較結果について、同じオブジェクトの組に対しては常に &a < &b もしくは &a > &b の何れか一方のみが成り立つことが保証されていますか?


710デフォルトの名無しさん:2008/01/06(日) 01:29:15
>>709
後者はno。
aとbが同じオブジェクトであるとか、同じ配列オブジェクトの要素であるとか、
同じ構造体や共用体のメンバであるとかの場合を除いて、
オブジェクトのポインタの順序を比較した場合の動作は未定義。
711デフォルトの名無しさん:2008/01/06(日) 01:51:16
前者もダメじゃないか?
オブジェクトの一つ後ろの要素を参照してよいのは配列に対してのみ。
むかし実際に &a[NUM-1] がメモリの最後を指していて &a[NUM] が null になるケースにであったことがある。
712デフォルトの名無しさん:2008/01/06(日) 02:09:18
漏れもそんな気がする
malloc(sizeof(T) * NUM), operator new(sizeof(T) * NUM) -> NG
T a[NUM], new T[NUM] -> OK
713デフォルトの名無しさん:2008/01/06(日) 07:21:21
>>709
大丈夫。&a[NUM]は中身を見ない限り保証されている。

>>711
それは、aの確保に問題がないか?

>>712
スレ違い。つーか、あんた馬鹿?
714デフォルトの名無しさん:2008/01/06(日) 08:18:03
お前がバカ
715デフォルトの名無しさん:2008/01/06(日) 10:26:34
>>713
これほどまでの馬鹿をかつてみたことがない
716デフォルトの名無しさん:2008/01/06(日) 13:12:04
>>713
>大丈夫。&a[NUM]は中身を見ない限り保証されている。
規格のどこに明記されてるの?
手元の禿本p125、128では配列についてしか述べられてないけど
717デフォルトの名無しさん:2008/01/06(日) 14:25:35
malloc( sizeof(T) * n + 1 )しとけば。
718デフォルトの名無しさん:2008/01/06(日) 14:28:01
>>717
それだとchar型以外の型のポインタを取るのは不正な気がする。
719デフォルトの名無しさん:2008/01/06(日) 14:37:02
>>710
実際問題、&a == &bが偽なら&a < &bもしくは&a > &bが成り立つと仮定してよいのでは?
でも、確かに規格には全順序でなければならないなんて規定はないんだよね……。
720デフォルトの名無しさん:2008/01/06(日) 14:49:34
そのような仮定には意味がない。
スレタイ音読しる。
721デフォルトの名無しさん:2008/01/06(日) 14:51:16
C99ならuintptr_tにキャストしておけば順序比較は出来る。
722デフォルトの名無しさん:2008/01/06(日) 15:30:02
>>713
ソースきぼん
723デフォルトの名無しさん:2008/01/06(日) 18:07:05
>>721
できるけど後ろを指すポインタの方が整数値が大きくなるという保証はどこにもない
724デフォルトの名無しさん:2008/01/06(日) 18:08:00
>>722
規格に「配列オブジェクト」と書かれているのをスルーした713の脳内
725デフォルトの名無しさん:2008/01/06(日) 18:23:46
便乗で聞きたいんだけど、配列に対してlength番目へのポインタの値が保証されてるのは何で?
726デフォルトの名無しさん:2008/01/06(日) 18:24:17
何で→どういう必要性で
727デフォルトの名無しさん:2008/01/06(日) 18:54:50
for( p=&arr[0]; p!=&arr[elementof(arr)]; p++ )
みたいなループを書きたいときだってあるだろう
728デフォルトの名無しさん:2008/01/06(日) 20:16:19
>>723
それは別にかまわないんじゃない?

>同じオブジェクトの組に対しては常に &a < &b もしくは &a > &b の何れか一方のみが成り立つ

としかか書かれてないんだから、比較するたびに &a < &b が &a > &b になったりしなければ。
極端な話、&a < &b < &c < &a なんて関係になっていても質問の条件は満たしてる。
729デフォルトの名無しさん:2008/01/06(日) 20:18:36
&a < &aが成り立つのは不味くないか?
730デフォルトの名無しさん:2008/01/06(日) 20:22:51
>>728
「同じオブジェクトを指すポインタは、整数としてみた場合常に同じ値になる」
ということは保証されてない気がする。
さすがに変更してないのに比較するたびに変わったりはしないだろうけど
731デフォルトの名無しさん:2008/01/06(日) 20:57:47
>>729
&a < &b < &c < &a は (&a < &b), (&b < &c), (&c < &a) が同時に成り立つって意味ね。
メモリモデルがフラットじゃなければアドレスは比較の度にオフセットやら何やらの組み合わせから何らかの仮想的な値にマップされて比較される。
だから (&a < &b) の時の &a と (&c < &a) の時の &a は内部的には違う値として表現されることがある。
732デフォルトの名無しさん:2008/01/06(日) 21:00:16
結局どうなの?
>>713の言うように保証されてるの?
733デフォルトの名無しさん:2008/01/06(日) 21:01:48
同じオブジェクトを指すポインタは等しい、つまり &a == &a は常に正しいでしょ。
で、ポインタは必ず(なんらかの)整数型に変換でき、情報を保ったまま戻すことが出来る、
つまり (T *)(intptr_t)&a == (T *)(intptr_t)&a でしょ。
それでも、 (intptr_t)&a == (intptr_t)&a は保証されないのかな。
734デフォルトの名無しさん:2008/01/06(日) 21:02:23
そんなマジレスされても・・・ (´・ω・`) まぁわかってていったんだけど
中途半端に省略するのはイクナイ
735デフォルトの名無しさん:2008/01/06(日) 21:02:58
>>734>>731
736デフォルトの名無しさん:2008/01/06(日) 21:08:50
横からごめん。
見てて、ふと16bit時代を思い出したよ。

farだと正規化されてないから違うとか、
hugeだと常に正規化されるから
大丈夫だけど遅いとか。
737デフォルトの名無しさん:2008/01/06(日) 21:33:26
hugeだとオフセットの桁あふれをセグメントに加算するだけで、正規化はされてないんじゃなかったっけ?
記憶違いだったらごめん。
738デフォルトの名無しさん:2008/01/06(日) 21:57:03
borlandのHUGEは、たしか、オフセットの上位12bitが0になるように
正規化してた記憶がある。MSCのHUGEは知らない。
739デフォルトの名無しさん:2008/01/06(日) 22:46:12
borland 補正 = サイズ自由、セグメントを沢山使う -> Win286で没
MS 補正せず = サイズの境界が64Kになる制限、比較時に微妙 セグメント最小限
740デフォルトの名無しさん:2008/01/07(月) 03:34:07
>>733
同じオブジェクトを指すポインタだからといって同じ変数に格納されているとは限らない
具体例を言っちゃうと、farポインタは同じアドレスを指していても4096通りの表現が
あるわけだが。
741デフォルトの名無しさん:2008/01/07(月) 04:07:16
日本語が不自由な方ですね。
小学校に入りなおして、「こくご」の読解力を養ってはいかがですか?
742デフォルトの名無しさん:2008/01/07(月) 05:13:25
まず、フラッシュメモリにデータを書き込みます。
そしてそのデータが書き込まれたセクタ?(アドレス?)を取得する方法ってありますか?
743デフォルトの名無しさん:2008/01/07(月) 05:27:52
果てしなくスレ違いです
744742:2008/01/07(月) 05:57:57
>>743
すみません…
一応Cでのプログラミングで取得可能か?という事で質問しました。

相応しいスレがあれば誘導お願いします。
745デフォルトの名無しさん:2008/01/07(月) 06:02:45
>>744
環境依存OKのとこだとここかな
http://pc11.2ch.net/test/read.cgi/tech/1198755167/l50
746デフォルトの名無しさん:2008/01/07(月) 06:03:05
>>1くらい読め

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

【初心者歓迎】C/C++室 Ver.42【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1188748806/
C/C++の宿題を片付けます 95代目
http://pc11.2ch.net/test/read.cgi/tech/1187944110/
747742:2008/01/07(月) 06:12:23
>>745-746
失礼致しました。
紹介して頂いたスレで、改めて質問し直したいと思います。
748デフォルトの名無しさん:2008/01/08(火) 02:39:54
>>716
malloc で配列を確保したんだから、配列についての記述に基づいて問題ないでしょ。
749748:2008/01/08(火) 02:41:37
あと、 >432-436 が関係あるかもね。
750デフォルトの名無しさん:2008/01/08(火) 02:42:00
>>713
751デフォルトの名無しさん:2008/01/08(火) 02:49:09
型も分からずただ与えられたサイズのメモリを
確保するだけのmallocで保証されてるとは思えない
752デフォルトの名無しさん:2008/01/08(火) 02:52:16
>>751
int* a = malloc(sizeof(int));

*a の振舞いが規格中の int についての記述に従うと言っても信じないの?
753デフォルトの名無しさん:2008/01/08(火) 02:52:16
>>748-749
適当な推測で語らないでください^^
754デフォルトの名無しさん:2008/01/08(火) 02:53:50
>>752
信じません。
755デフォルトの名無しさん:2008/01/08(火) 02:57:56
>>752
そんな話してないでしょ?
malloc(size)で確保したものが配列かどうかってのが焦点
詳しい人とか規格持ってる人誰か検索して見つけてくれないかな
756デフォルトの名無しさん:2008/01/08(火) 03:08:19
>>755
「malloc(size)も確保したものが配列である」なんて書き方がしてあるところはないだろうけど、
ちょっと探してみる。

とりあえず 6.5.6 Additive operators から
> For the purposes of these operators, a pointer to an object that is not an element of an
> array behaves the same as a pointer to the first element of an array of length one with the
> type of the object as its element type.

加算演算子の振舞いについて、配列要素でないオブジェクトへのポインタは、要素数1の
配列要素を指すポインタと同様に振舞う、とされている。

これから考えても >752 の a が int [1] を指してると言っても問題ないだろうね。
そうなると複数要素の配列のときだけダメなんてルールになってるわけないと思う。
757デフォルトの名無しさん:2008/01/08(火) 03:15:03
加算において配列の要素のように振舞ったとしても、
それ自体、配列オブジェクトでないならば、比較が定義されない。
758デフォルトの名無しさん:2008/01/08(火) 03:20:49
>>755
あった。

7.20.3 Memory management functions の p1 より抜粋。
> The pointer returned if the allocation
> succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
> and then used to access such an object or an array of such objects in the space allocated
> (until the space is explicitly deallocated).

確保が成功したときに返されたポインタはどんな型のポインタにも代入でき、その場合
確保された領域にあるそのオブジェクトまたはオブジェクトの配列に(明示的に解放される
までの間)アクセスするのに使用できるよう、適切にアラインされている。
759デフォルトの名無しさん:2008/01/08(火) 03:23:55
>>757
実は比較演算子についての 6.5.8 Relational operators にも >756 に挙げたのと
同じ文面が載ってるんだぜ。
760デフォルトの名無しさん:2008/01/08(火) 03:28:28
っていうか配列として宣言したオブジェクトの要素を指すポインタと動的に確保した
配列の要素を指すポインタとでわざわざ振る舞いが違うわけねーだろって話だよ。常考。
ポインタと要素数だけ受け取る関数の身にもなってみろ。
761デフォルトの名無しさん:2008/01/08(火) 03:49:03
>>758
アラインの話じゃねぇぇえーー
762デフォルトの名無しさん:2008/01/08(火) 03:52:24
>>761
「オブジェクトの配列にアクセスするのに使用できる」って書いてあるのじゃ不満なのか?
これで不満ならもうお前が何の話をしてるのかわからんから教えてください。
763758:2008/01/08(火) 04:06:14
てきとうな抜粋と翻訳がまずかったかな。 >758 で抜粋したところの直後にはこう続く。
> The lifetime of an allocated object extends
> from the allocation until the deallocation.
764デフォルトの名無しさん:2008/01/08(火) 05:33:02
>配列でないオブジェクトへのポインタは要素数1の配列を指すポインタと同様に振舞う、
のであって、「配列でないオブジェクトも配列である」ではないな。
ポインタ≠アドレス。

765デフォルトの名無しさん:2008/01/08(火) 05:53:56
> 配列の要素を指すポインタとでわざわざ振る舞いが違うわけねーだろって話だよ。常考。
> ポインタと要素数だけ受け取る関数の身にもなってみろ。

規格の話ではないが、MSのライブラリ作成者の一人 Steve Maguire は自著 "Writing Solid Code" の中で
「for( p = pch; p < pch + size; ++p ) というコードは名前付き配列に対してしか動作しないのでライブラリの中では使用できない」
としているな。
きちんとした関数作成者なら、そこらへんは意識してコードを書いているだろう。

もちろん、ポインタと要素数だけ受け取って「ポインタが名前付き配列を指している」と勝手に仮定してコードを書いている人間の方が多いだろうが。
766デフォルトの名無しさん:2008/01/08(火) 06:20:13
「非配列要素を指しているポインタが配列要素を指しているポインタのように振る舞えたとして、非配列要素が配列要素になるわけではない」
なんかリンカーンの言葉みたいだ。
767デフォルトの名無しさん:2008/01/08(火) 09:33:39
>>765
うまく動かない名無しの配列(って何?)が想像できないのだけど...
768デフォルトの名無しさん:2008/01/08(火) 11:49:30
>>764
それがどうした?問題は振舞いが定義されているかどうかだろ?
769デフォルトの名無しさん:2008/01/08(火) 12:07:42
結論が出たら三行にまとめといてくれ
770デフォルトの名無しさん:2008/01/08(火) 13:28:30
>配列でないオブジェクトへのポインタは要素数1の配列を指すポインタと同様に振舞う

あくまで要素数1の配列なんだから保証されているとしてもそれはa+1までだろ
771デフォルトの名無しさん:2008/01/08(火) 13:35:38
>>767
もしpch+sizeがオーバーフローして0になってしまったらp<pch+sizeは真になることがない
772デフォルトの名無しさん:2008/01/08(火) 13:42:50
>>760
もしそうならわざわざ
>配列要素でないオブジェクトへのポインタは、要素数1の配列要素を指すポインタと同様に振舞う
なんて限定的に書くわけないだろう
動的に確保したメモリは配列と同様に扱われる、で済む
773デフォルトの名無しさん:2008/01/08(火) 14:22:15
>>772
その記述は int a に対する &a の振舞いも含めて定義するためのもの。
「動的に確保した〜」では不十分だよ。

758 の引用した箇所で malloc で配列を確保できると言えそうだから、もう
その記述はあんまり関係ないと思う。
774デフォルトの名無しさん:2008/01/08(火) 14:39:06
オマイラすごいな
でも漏れも気になるし大事なことだから頑張って解明してくれエロイ人
775デフォルトの名無しさん:2008/01/08(火) 14:40:43
結論
どーでもいい
776デフォルトの名無しさん:2008/01/08(火) 14:46:48
>うまく動かない名無しの配列(って何?)が想像できないのだけど...
char *pch = malloc( size ) された動的配列(名無しの配列)に対しては上手く動かない。
777デフォルトの名無しさん:2008/01/08(火) 14:47:36
そのうまくいかないという処理系を教えてくれ。
778デフォルトの名無しさん:2008/01/08(火) 14:49:15
処理系の話はしてない
規格で保証されているか、されてないか
779デフォルトの名無しさん:2008/01/08(火) 14:50:56
>>776
配列の振舞いについて名無しかどうか、動的に確保されたものかどうかという区別が
規格にあるの?
780デフォルトの名無しさん:2008/01/08(火) 15:08:59
>>758を読むかぎり、mallocの返すポインタはあらゆるオブジェクトまたは
オブジェクトの配列に対するポインタとして扱う(代入する)ことができなければならない
という風に読めるから、mallocした領域であってもpch+sizeがオーバフローしないことは
保証されてるんじゃないかな
781デフォルトの名無しさん:2008/01/08(火) 15:09:07
ゼノンいわく物体の運動など保証されないみたいな話だな。
782デフォルトの名無しさん:2008/01/08(火) 15:17:54
mallocの返すポインタの先に確保される領域は、その時点においてはオブジェクトでもオブジェクトの配列でもないが、
それを特定のオブジェクトへのポインタに代入したときには、そのように扱うことができなければならないとされている
よってどんなオブジェクトへのポインタに対しても、少なくとも確保した領域の大きさが許す範囲において、
pch+size はオーバーフローしないことが保証されていなければならない

こうか?
783デフォルトの名無しさん:2008/01/08(火) 15:19:51
限りなくどうでもいい
784デフォルトの名無しさん:2008/01/08(火) 15:28:41
ここで考えるべきはオブジェクトのアドレスについてであってポインタの振る舞いのではないか?

「ポインタは指している先が配列オブジェクトの要素でなくても配列オブジェクトを指している場合と同様に振る舞う」ってことは、全てのオブジェクトはポインタ演算中は配列として扱えることになる。
だとしたら、「配列オブジェクトの最後の要素の1つ次のアドレスを求めることが出来る」と配列オブジェクトと限定する意味がない気がする。
785デフォルトの名無しさん:2008/01/08(火) 15:31:53
こういうネタは糞壁先生に聞いてきてくれ。
786デフォルトの名無しさん:2008/01/08(火) 15:33:09
>>777
VC, MS-C は昔からそういうことがあるってのは知られている。
>>711, >>432-436 で指摘されているのも多分MSのコンパイラだろう。


787デフォルトの名無しさん:2008/01/08(火) 15:34:41
果てしなくどうでもいい
788デフォルトの名無しさん:2008/01/08(火) 15:59:57
暇なんだよ
789デフォルトの名無しさん:2008/01/08(火) 16:10:31
要は、「最後の一つ次」の扱いが問題って琴音?
790デフォルトの名無しさん:2008/01/08(火) 16:18:13
used to access such an object or an array of such objects in the space allocated
直訳すると
確保した領域内にあるオブジェクトないしオブジェクトの配列のようなものにアクセスするための

such(ようなもの)をどうとるかが難しいところだ
791デフォルトの名無しさん:2008/01/08(火) 16:18:34
最後のひとつ次って、どう使うんだ?
792デフォルトの名無しさん:2008/01/08(火) 16:19:07
あ、違うな
確保した領域内にあるそういったオブジェクト、ないしそういったオブジェクトの配列にアクセスするための

だから配列であるとみなしていいんじゃね?
793デフォルトの名無しさん:2008/01/08(火) 16:22:05
仮にmallocされた領域も正当な配列オブジェクト同様に扱われなければならないとしたら
MSは厳密には規格に準拠してないってことか
794デフォルトの名無しさん:2008/01/08(火) 16:22:41
まあまて
「オブジェクトの配列」と「配列オブジェクト」は同じものなのか?
795デフォルトの名無しさん:2008/01/08(火) 16:28:22
お前らが見てるのってC99か?
俺の記憶が正しければ、任意の妥当なポインタに対して+1が定義されるように
C99で変更されたんだったような気がする。ANSI Cの仕様書ないからわからんけど。
796デフォルトの名無しさん:2008/01/08(火) 16:38:43
>>765
> 「for( p = pch; p < pch + size; ++p ) というコードは名前付き配列に対してしか動作しないのでライブラリの中では使用できない」

なぜこれが、動的に確保した領域だと動作しないのでしょう?
797デフォルトの名無しさん:2008/01/08(火) 17:20:08
>>796
動的に確保した領域だと必ず動作しない という意味ではないよ。
動作しない場合が稀にあり得るという意味。
(今時のPC環境で実際に動かない場合を作るのはかなり無理)
理由は、mallocは一個が何バイトなのかわからないから。
普通の配列は一個のバイト数がわかるから、一個分以上の余裕がある場所なのかどうかわかる。
798デフォルトの名無しさん:2008/01/08(火) 17:21:48
意味がわからん
799デフォルトの名無しさん:2008/01/08(火) 17:56:43
1個のバイト数がわからんでも、そこを指すことが出来さえすればいいんだから、1バイトあれば十分なんじゃ?
800デフォルトの名無しさん:2008/01/08(火) 18:16:51
>>758の日本語訳
7.20.3 記憶域管理関数 calloc 関数、malloc 関数及び realloc 関数の
連続する呼び出しによって割り付けられる記憶域の順序及び隣接製は、
未規定とする。割り付けが成功したときに返されるポインタは、
いかなる型のオブジェクトへのポインタに代入しても良いように、
また(領域が明示的に解放されるまで)その割り付けられた領域の
オブジェクト又はオブジェクトの配列へのアクセスに使用しても
よいように、適切に境界調整されているものとする。
801デフォルトの名無しさん:2008/01/08(火) 18:47:12
>>796
>>711, >>432-436 を読め。
802デフォルトの名無しさん:2008/01/08(火) 18:54:32
>>795 の言うとおりであれば、

C99より前:
 char *p = malloc( size );
 に対して p + size は保証されない。

C99以降:
 int n;
 int *p = &n;
 に対しても p + 1 が可。

が回答だな。
803デフォルトの名無しさん:2008/01/08(火) 19:03:15
>>797
>理由は、mallocは一個が何バイトなのかわからないから。
それは違うぞ。
理由は、コンパイラ作成者が規格を "動的に確保された領域に対して p + size を保証する必要がない" と解釈したからだ。
やろうとすれば処理系は malloc() 時に、システムに1バイト余計(現実的には8バイトか?)に要求するだけで malloc() を p + size 安全にすることが出来たはず。
804デフォルトの名無しさん:2008/01/08(火) 19:14:08
>>796
>「for( p = pch; p < pch + size; ++p ) というコードは名前付き配列に対してしか動作しないのでライブラリの中では使用できない」
>なぜこれが、動的に確保した領域だと動作しないのでしょう?

例えばアドレス, メモリ空間が 32 bit の場合、
・プログラムがOSに 0x10 バイトの領域を要求する。
・OSがプログラムにアドレス 0xFFFFFFF0 - 0xFFFFFFFF の 0x10 バイトを割り当てる。
・pch + size は 0xFFFFFFF0 + 0x10 なのでオーバーフローする。
・ポインタ演算がオーバーフローした場合の動作は保証できない。
となる。
805デフォルトの名無しさん:2008/01/08(火) 19:21:13
まあ、実際問題16bitとともに去りぬ、って感じだけど。
806デフォルトの名無しさん:2008/01/08(火) 19:24:58
あ、必要な余裕は一個分じゃなくて最低1バイトでいいのか。
で、mallocの実装に対してその要求は明記されてなかった(C99でされた?) と。
807デフォルトの名無しさん:2008/01/08(火) 19:31:06
最後の最後で最低1バイト分余裕があればいい。
たとえば16bit空間なら、malloc対象を0〜0xfffe( 65535byte)に
制限すればおk。
808デフォルトの名無しさん:2008/01/08(火) 19:55:41
>で、mallocの実装に対してその要求は明記されてなかった(C99でされた?) と。
もちっと細かく言えば
依然として malloc については何も言われていないが "char a[ num ]; の場合に限り" が "全てのオブジェクトについて" に拡張された影響で malloc も含まれるようになった、と。
809デフォルトの名無しさん:2008/01/08(火) 20:41:29
つまり、for(ofs=0; ofs < size; ofs++) { p+ofsを使う }ならOKってこと?
810デフォルトの名無しさん:2008/01/08(火) 21:27:35
ポインタを「最後の次」にすると(例のforを抜ける時のp)、
配列として確保したものの最後の次なら問題ないけど、
mallocで確保したものだとおかしいポインタかもしれない、と。
C99以前では。
811デフォルトの名無しさん:2008/01/09(水) 00:06:53
>809
そういうこと。
812デフォルトの名無しさん:2008/01/09(水) 01:01:33
結局mallocで確保した場合は保証されないのか
813デフォルトの名無しさん:2008/01/09(水) 01:09:55
>>812
C99なら、終端を一つ飛び越えたところのポインタを得ることはできて、
割り付けられたオブジェクトの範囲を指すポインタと比較できる、
ということがこれまでの議論で大体明らかになった。

だが、ANSI Cだとどうなるかは、規格書が出てきてないからまだわからない。
814デフォルトの名無しさん:2008/01/09(水) 01:22:16
配列終端(および単一オブジェクトへのポインタ +1 )がオーバーフローを起こしては
いけないっていう制約を満たせない malloc の実装に遭ったことがあるという人がいる
というだけの話。

要素数 NUM の配列 a に対して &a[NUM] は有効。
815814:2008/01/09(水) 01:26:51
765 が挙げてる Writing Solid Code での「名前付き配列」限定の話が
気になったんでぐぐってみた。
http://www.google.co.jp/search?q=%22writing+solid+code%22+%22named+array%22

そしたらこんなのが見つかった。
http://www.five-ten-sg.com/risks/risks-20.69.txt
(長いんで "Writing Solid Code" で検索して該当箇所に飛んで)
引用すると
> The limitations on addition involving pointers are specified in section
> 3.3.6 of the original ANSI C standard, 6.3.6 of the first ISO version,
> and 6.5.6 of the new standard; in all cases the wording refers to an
> "array object". "Object" essentially just means a region of data storage
> (defined in section 1.6/3.14/3.14), and dynamically allocated space can
> certainly be accessed as an array (see section 4.10.3/7.10.3/7.20.3).

んで適当に翻訳すると

「ポインタを含む加算についての制限はオリジナルの ANSI C 標準規格の 3.3.6 、
 最初の ISO 版の 6.3.6 と、新しい標準の 6.5.6 で規定されており、すべての場合で
 その文面は「配列オブジェクト」を指している。「オブジェクト」とは本質的にはただの
 データ記憶域の範囲(1.6/3.14/3.14 で定義されている)であり、動的に確保された
 領域は間違いなく配列としてアクセスできる。(4.10.3/7.10.3/7.20.3 を参照)」

C99 より前だと動的配列の終端がオーバーフローすることがあったかのように
言う人が何人かいたみたいだけど、 ANSI C の時点で同様の文面があって、そんな
実装は規格(あるいは規格の意図)に沿っていなかっただけなんじゃないかと思う。
"Writing Solid Code" が書かれた時代ということを考えれば不思議でもなんでもない。
816デフォルトの名無しさん:2008/01/09(水) 02:11:22
では何故わざわざ "Object" ではなく "array object" という語を使ったのだろうという疑問が残るが。
817デフォルトの名無しさん:2008/01/09(水) 02:16:21
>>816
何言ってんだ?「オブジェクト」じゃ配列内要素(または "past the end" )を指す
ポインタ間の関係の説明にならないでしょ。
818デフォルトの名無しさん:2008/01/09(水) 02:18:10
どちらにしろ、解釈が分かれるような規格じゃ
規格として不完全ってこった。
819デフォルトの名無しさん:2008/01/09(水) 02:22:12
>>818
規格を読んだ上でその記述に基づいて「動的配列の終端はオーバーフローする
可能性がある」と主張した奴が一人でもいたか?

そうじゃなけりゃ解釈が分かれているとは言わないだろ。
820デフォルトの名無しさん:2008/01/09(水) 02:46:41
× 「動的配列の終端はオーバーフローする可能性がある」と主張
○ 配列オブジェクト以外には保証されていないと主張
821デフォルトの名無しさん:2008/01/09(水) 02:49:41
array object は object の一種なわけで、object に言えることが array object にも言えるってことは直感的に分かるが、array object に言えることが object 全般にも言えるってのはどうなんだろう。
822デフォルトの名無しさん:2008/01/09(水) 02:50:42
malloc で確保した領域は array object に相当する、という主張なのでは
823デフォルトの名無しさん:2008/01/09(水) 03:01:40
「本質的にはオブジェクトなんて単なるデータ記憶域の範囲でしかないのだから...」って議論は
http://www.kouno.jp/home/c_faq/c2.html#6
と同じでグレーゾーンって気がする。
824デフォルトの名無しさん:2008/01/09(水) 03:02:08
>>813
C99ってANSIにはなってないのか?
C89って言った方が確実な希ガス
825デフォルトの名無しさん:2008/01/09(水) 03:13:58
似たような話題で失礼します。
struct x; を char *p=(char *)&x; のようにして sizeof(x) バイトの配列としてアクセスできることは保証されていますか?
826デフォルトの名無しさん:2008/01/09(水) 03:25:51
断片的なひとりごとみたいなのが多くてよくわからんな。

結論は

int* a = malloc(sizeof(int) * NUM) に対して a + NUM が配列の
"one past the last element" として使えないような実装は標準規格に
違反している。

ってことでいいか?

>>758 の引用を読んでまだこれを否定するやつなんていないだろ?
いるなら規格の記述に対する解釈を述べてくれ。
827デフォルトの名無しさん:2008/01/09(水) 03:30:29
>>825
されている
828デフォルトの名無しさん:2008/01/09(水) 03:35:25
>>825
問題ない。 6.5 Expressions の p7 でオブジェクトへのアクセスに使ってもいい型の
リストがあがっていて、そこにはオブジェクトの型に関わらず "a character type" が
含まれている。
829デフォルトの名無しさん:2008/01/09(水) 03:40:32
>>823
オブジェクトがただの記憶域だというのは規格中の用語の定義から明らかであり、
議論の余地はない。

3.14 より object の定義
> region of data storage in the execution environment, the contents of which can represent
> values

その FAQ にある例が規格に準拠していない理由は、構造体終端のパディングとか、
他の理由でしょ。
830デフォルトの名無しさん:2008/01/09(水) 03:50:59
「オブジェクトは単なる記憶域」だということにコメントしたつもりは全くないのだが。
「オブジェクトは単なる記憶域だから配列に言えることはオブジェクトに一般化して言える」と言えるのかってこと。
831デフォルトの名無しさん:2008/01/09(水) 04:20:22
>>830
具体的になんのこと?

「配列に言えること」っていっても、それが要素数や要素型に触れたことなら
単一オブジェクトに一般化できないのはあたりまえでしょ。

単一オブジェクトを指すポインタ p に対する p + 1 の話なら >756 で引用された
特記事項があるから適用できる。
832831:2008/01/09(水) 04:26:59
あれ?そもそも、
「オブジェクトは単なる記憶域だから配列に言えることはオブジェクトに一般化して言える」
なんて話は誰もしてないような。やっぱり 830 が何を問うているのかわからん。
833デフォルトの名無しさん:2008/01/09(水) 07:35:27
objectが単なる記憶域であるのはいいとしてさ、
普通に考えたらarray objectはobjectをarrayで限定的に修飾してるんだから、
「配列の記憶域」みたいな感じだろ?
この配列が動的確保したものも含めるかどうかは
834デフォルトの名無しさん:2008/01/09(水) 09:47:17
含めるのが当然だよな。含めない理由がどこにもない。
835デフォルトの名無しさん:2008/01/09(水) 10:47:34
含める理由もないがな
836デフォルトの名無しさん:2008/01/09(水) 11:02:14
>>833
「配列オブジェクト」が「動的確保した配列オブジェクト」を含むかどうかわからない
とか不思議なことを言っているようにしか見えない。
837デフォルトの名無しさん:2008/01/09(水) 11:05:11
>>826
>>758の引用を読んで、そのような結論に至る思考プロセスが理解できない。
838デフォルトの名無しさん:2008/01/09(水) 11:08:08
>>837
なら別の結論と、それにいたる規格の解釈を述べてくれ。
839デフォルトの名無しさん:2008/01/09(水) 11:28:08
>確保された領域にあるそのオブジェクトまたはオブジェクトの配列に(明示的に解放される
>までの間)アクセスするのに使用できる

動的確保領域に配列としてアクセスできるのは分かるが、
配列オブジェクトと同等にみなすことはできないんじゃね?
array+sizeのポインタ演算は配列へのアクセスじゃないだろ
840デフォルトの名無しさん:2008/01/09(水) 11:39:57
>>839
「配列」と「配列オブジェクト」は違うってことか?斬新だな。

でもそんなこといったら "one past the last element" に限らず加算演算自体とか、
そのほかいろいろな記述が動的に確保した配列に適用できないんだけど、ほんとに
そう思うの?

まぁこの際だからいちおう調べてみるけどね。
841840:2008/01/09(水) 12:21:41
>>839
規格全体を見ると "array object" じゃない "array" は型についての説明で多く見られた。
でも >>756 の引用箇所のように、明らかにオブジェクトについての記述だとわかるところ
では "array object" の意味で "array" が使われているところもあった。

問題の箇所は「オブジェクトの配列」とあるから、これの意味するところは配列オブジェクト
と同等にみなすのが自然だし、そうしないと 840 で言ったように動的に確保した配列に
ついてほとんどのアクセスが認められなくなってしまうので「アクセスするのに使用できる」
とした記述と矛盾するので、これ以外の解釈はできないと言える。
842840:2008/01/09(水) 12:39:38
「規格全体を見ると」とか言ってるけど、実際に見たのは
http://www.open-std.org/jtc1/sc22/wg14/
からダウンロードできるドラフト n1124.pdf 。今見直したらもっと新しいバージョンの
n1256.pdf がダウンロードできるみたいだね。

次スレからテンプレに入れといたほうがいいかも。
843デフォルトの名無しさん:2008/01/09(水) 13:39:13
話を意図的に飛躍させたりずらしたりしてるやつがいるな。
何が面白いんだか。
844デフォルトの名無しさん:2008/01/09(水) 14:38:57
そんなことをしても頭悪そうにしか見えないのにねえ。
わかっていないのは本人だけで、みんなは内心馬鹿にしているのに。
845デフォルトの名無しさん:2008/01/09(水) 18:37:31
わかっていないのなら意図的ではないんじゃないの?
846デフォルトの名無しさん:2008/01/09(水) 19:02:14
おまえあたまいいな
847デフォルトの名無しさん:2008/01/09(水) 21:15:42
>>845
!!!
848デフォルトの名無しさん:2008/01/09(水) 21:21:34
どっちが間違っているのかは意図的に言わないことで自分が間違っていた場合の
保険を掛けているわけですね。
名無しの恥なんてかきすてなんだから何の意味があってそんなことする必要がある
のか全くわからんが。
849デフォルトの名無しさん:2008/01/09(水) 23:02:49
なんかとても気になるらしいw
850デフォルトの名無しさん:2008/01/15(火) 20:27:40
流れが止まったところで質問させてください。
仮に
char ar[10];
として、4番目の要素へのポインタを引数で渡すようなとき
&ar[3]
と書く人と
ar+3
と書く人がいるみたいですが、このスレ的には、
どういう違いがありますか?
851デフォルトの名無しさん:2008/01/15(火) 20:28:10
すいません、ageます。
852デフォルトの名無しさん:2008/01/15(火) 20:29:14
>>850
添え字が範囲内であれば完全に等価です
853デフォルトの名無しさん:2008/01/15(火) 22:43:21
好みの問題だな。
特に指定がなければ、
個人的に分かりやすい方を書けばいいんじゃね。
854850:2008/01/15(火) 23:49:47
ありがとうです。
文脈を考えながら使い分けて見ます。
855デフォルトの名無しさん:2008/01/16(水) 00:20:39
漏れは &ar[3] 派だな。
ar+3 はなんか直感的じゃない。
856デフォルトの名無しさん:2008/01/16(水) 00:31:06
引数で渡すときは&ar[3]だなぁ
計算の途中なんかだとは(ar+3)って書いたりするけど
857デフォルトの名無しさん:2008/01/16(水) 00:36:04
1要素だけ渡すような場合は &ar[3] が一番しっくりくる。
配列として渡すような場合はどっちでもいい感じ。
858デフォルトの名無しさん:2008/01/16(水) 00:42:29
まあこのスレ的にはどっちでもいいんだがな。
859デフォルトの名無しさん:2008/01/16(水) 06:01:49
ar+3派だな、文字数少なくてすむから。
そもそもar[3]は*(ar+3)のシンタックスシュガーなんだから、
無意味な二度手間だと思うし。
860デフォルトの名無しさん:2008/01/16(水) 07:18:01
二度手間つってもコンパイル時の手間だから性能には影響なしだけどな
861デフォルトの名無しさん:2008/01/16(水) 07:30:22
>>859
伝える努力を放棄するくらいならアセンブラでも使えば?
862デフォルトの名無しさん:2008/01/16(水) 07:34:32
伝える努力ってなんだよw
ar+3だと理解できないヤツとかいんの?
863デフォルトの名無しさん:2008/01/16(水) 07:37:11
直感的じゃないってことだろ。Cにどっぷりはまって抜け出せないロートルを除けば。
つーか、いい加減スレ違いだからスタイルスレにでも行けば?
864デフォルトの名無しさん:2008/01/16(水) 07:38:47
伝える努力以前の問題だろうな。こういうやつは。
汚いソースを平気で書いても何が悪いのか分からないようなやつ。
865デフォルトの名無しさん:2008/01/16(水) 09:51:56
arにするか、&ar[0]にするかはたまに悩む
866デフォルトの名無しさん:2008/01/16(水) 10:12:35
いいかげんスレ違いは止め
867デフォルトの名無しさん:2008/01/16(水) 13:10:21
特定要素だけの場合は&ar[3]
範囲を狭めた配列という意味で渡す場合はar+3
868デフォルトの名無しさん:2008/01/16(水) 13:18:42
まだ続けるの?
869デフォルトの名無しさん:2008/01/16(水) 13:20:56
&ar[3]なんて書く奴はnoob
10万行くらいコード書けば考えも変わるだろう
870デフォルトの名無しさん:2008/01/16(水) 16:00:10
関数内の変数の値を、次回呼び出したときにも残っているようにしたいんですけど
static修飾師を付けると異なるスレッドからアクセスした時に変数の値が書き換えられてしまいます。

各スレッド用に、個別に変数の値を保持する方法ってないですか。
871デフォルトの名無しさん:2008/01/16(水) 16:13:54
スレッドローカルで
872デフォルトの名無しさん:2008/01/16(水) 16:33:45
Cってマルチスレッドを想定してたっけ?
873デフォルトの名無しさん:2008/01/16(水) 16:34:54
まあ環境依存だしスレ違いだから、この辺で
874デフォルトの名無しさん:2008/01/16(水) 17:07:48
POSIXの範囲内、というような話はスレ違いでおk?
875デフォルトの名無しさん:2008/01/16(水) 17:36:41
スレッドローカルストレージでググレカス
876デフォルトの名無しさん:2008/01/16(水) 18:00:33
きもい
877デフォルトの名無しさん:2008/01/16(水) 20:14:20
ここで質問していいことか分からないけども、質問。
このスレのC++版みたいなスレってある?
C++の厳格な規格のみを扱うスレ。
878デフォルトの名無しさん:2008/01/16(水) 20:22:34
一応これかな。

C++相談室 part60
http://pc11.2ch.net/test/read.cgi/tech/1200044614/

これは本来、規格限定の筈なんだが……

C++0x 2
http://pc11.2ch.net/test/read.cgi/tech/1191842951/
879デフォルトの名無しさん:2008/01/16(水) 20:54:54
C++0x スレは違うだろー
880デフォルトの名無しさん:2008/01/16(水) 23:16:14
>>874
POSIXもISOだかJISだかになってた気はするな
881デフォルトの名無しさん:2008/01/16(水) 23:34:38
>>870
各スレッドごとに固有の値が必要なら各スレッドごとに持て
具体的には関数内変数ではなく呼び出し元の変数に記録するようにしろ
882デフォルトの名無しさん:2008/01/17(木) 07:31:35
POSIX スレ立てるとか
883デフォルトの名無しさん:2008/01/17(木) 10:13:16
この板に立てるか、Unix板に立てるか、それが問題かも
884デフォルトの名無しさん:2008/01/17(木) 11:13:07
report.c というファイル名のプログラムをコンパイルしたが、
以下のようなエラーが出た。どのように解決したらいい?

/cygdrive/c/Temp/ccE0Li3g.o:report.c:(.text+0x62): undefined reference to `_Chan
ege'
collect2: ld returned 1 exit status
885デフォルトの名無しさん:2008/01/17(木) 11:16:09
スレ違いです。とりあえずスレ立てるまでもない質問スレへどうぞ
886デフォルトの名無しさん:2008/01/17(木) 13:58:27
どう見ても、cygwin+gcc+MinGW(みたいな)スレだろ・・・
887デフォルトの名無しさん:2008/01/17(木) 14:00:53
スレタイが悪いんだよ。
888デフォルトの名無しさん:2008/01/17(木) 14:24:55
>>884
まず英語を勉強してください
889デフォルトの名無しさん:2008/01/17(木) 20:00:08
このスレって規格についての話だけでPart132まで続いてきたの?
890デフォルトの名無しさん:2008/01/17(木) 20:05:34
昔は規格スレじゃなかった
891デフォルトの名無しさん:2008/01/17(木) 22:42:43
c言語を勉強して、1年位。
PADを書いてからプログラムを書くという流れで勉強してます。
実際、PADなり、フローチャートなり書いてからcプログラミングはしたほうがいいのかな?

892デフォルトの名無しさん:2008/01/17(木) 23:07:49
そんなものは必要無い
893デフォルトの名無しさん:2008/01/17(木) 23:46:11
・フローチャート
ループ記号をサポートしているツールが少ない。知らない香具師も多い。
だからと言って、ループも分岐で書いたら話にならない。

・PAD
書くことに夢中になると本質を見失いかねない辺りはフローチャート以上。
ツールもなくはないが、読める人間が少ないのも事実。

ってことで、擬似コーディングをお勧め。

# つーか、スレ違いだがね。
894デフォルトの名無しさん:2008/01/18(金) 01:13:21
c言語にファイルをコピー&ペースト(上書き)できるような関数はあるのですか

C#のmoveのような
895デフォルトの名無しさん:2008/01/18(金) 01:16:24
system("copy/b a.txt b.txt");
896デフォルトの名無しさん:2008/01/18(金) 06:31:02
>>892 >>893
ありがとう。すれ違い内容ですいませんでした。
897デフォルトの名無しさん:2008/01/18(金) 15:03:39
>>895
マテ、それだとクリップボードに残らないじゃないか
898デフォルトの名無しさん:2008/01/18(金) 15:14:01
>>897
スレ違い
899デフォルトの名無しさん:2008/01/18(金) 19:13:05
>>894
そもそも、標準Cにコピー&ペーストと言う概念がない
900デフォルトの名無しさん:2008/01/19(土) 00:09:13
>>887
どういうスレタイがいいと思う?
ちょうど900だし
901デフォルトの名無しさん:2008/01/19(土) 00:12:22
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132【限定】
は長くて無理だから
【標準】or【標準C】 C言語なら俺に聞け! Part 132 【限定】
とかか。
902デフォルトの名無しさん:2008/01/19(土) 00:25:43
ちょwww133にしろ
903デフォルトの名無しさん:2008/01/19(土) 00:26:05
標準Cなら俺に聞け!
でいいんじゃね
904デフォルトの名無しさん:2008/01/19(土) 00:38:15
ISO/ANSI/JIS とか書いてるけど、
別に ANSI だけでいいんじゃね?
他はコピーか訳だけなわけだし。
905デフォルトの名無しさん:2008/01/19(土) 00:52:58
ともかく>>1すら読めないゆとりに
環境依存の質問をするなという意図を明確に伝える必要があるな。
標準限定というのはもしかしたら歪曲的過ぎてよくわからない可能性があるw
906デフォルトの名無しさん:2008/01/19(土) 00:58:35
【規格厳密】標準Cなら俺に聞け!【環境依存禁止】
907デフォルトの名無しさん:2008/01/19(土) 00:59:04
標準Cしか俺にはわからん!聞くな!
908デフォルトの名無しさん:2008/01/19(土) 00:59:44
ああ、これじゃスレ番が入んねえやw
これでどうだ。

【規格厳密】標準Cなら俺に聞け! 132【環境非依存】
909デフォルトの名無しさん:2008/01/19(土) 01:09:41
132から離れろよw
910デフォルトの名無しさん:2008/01/19(土) 01:13:00
ああ、すまんすまん。つい。
911デフォルトの名無しさん:2008/01/19(土) 09:12:06
以下のソースを実行すると
#include <stdio.h>
#include <string.h>

int main()
{

char ss[]="空と海ABCDE";
char *p;
p = strchr(ss,'C');
puts(p);
p = strstr(ss,"C");
puts(p);

return 0;
}
出力:CABCDE
    CABCDE
となる。
なんで?
912デフォルトの名無しさん:2008/01/19(土) 09:44:59
SJISで「海」のコードが
0x8A43
'C'のASCIIコードが
0x43
913デフォルトの名無しさん:2008/01/19(土) 09:53:32
スレ違い質問に答えるなアホ
914912:2008/01/19(土) 09:59:47
初心者スレと間違えた
すまんこ

というわけで>>911スレ違いだ失せろ
915デフォルトの名無しさん:2008/01/19(土) 10:10:51
OSはMacを使ってます、それで、N個の数値を入力し、
それの合計値、平均値を作るプログラムを課題で出されて
作ったんですが、うまくまわりません、どうしたらいいですか?


#include<stdio.h>
#define N 5
void Sum_Ave(double input[], double *pmax, double *pmin);
main() {
int i;
double max, min;
double array[N];
printf("Input %d numbers\n", N);
for(i=0; i<N; i++) {
printf("array[%d] = ", i);
scanf("%f", &array[i]);
}
Sum_Ave(array, &max, &min);
printf("Sum = %f, Average = %f\n", max, min);
}

916デフォルトの名無しさん:2008/01/19(土) 10:12:15
void Sum_Ave(double input[], double *pmax, double *pmin) {
int i;
double max, min;


for(i=0; i<N; i++) {


max += input[i];

}

min = max/(i);
*pmax = max;
*pmin = min;
}
917デフォルトの名無しさん:2008/01/19(土) 10:15:47
【宿題禁止】も欲しい所
918デフォルトの名無しさん:2008/01/19(土) 10:18:52
>>917
まあまあ
自力で途中までやったということで
丸投げスレとの差別化を図るという意味での存在意義はあるんだから

>>915
>>916のdouble max初期化してない
919デフォルトの名無しさん:2008/01/19(土) 11:24:49
今のスレタイは一般の質問スレに見えるんだよな…
920デフォルトの名無しさん:2008/01/19(土) 11:55:27
2chブラウザのつくりが悪いんだよ。
2ペインにしてテンプレ読みながらレスを書けるようにしないとな。
921デフォルトの名無しさん:2008/01/19(土) 11:55:54
どーでもいいけどminは最小値
平均ならmeanだ
922デフォルトの名無しさん:2008/01/19(土) 12:02:28
あと100レスたらずの辛抱
923デフォルトの名無しさん:2008/01/19(土) 12:23:02
あと100たらずでスレは終わるが
スレッド名は変わるのか?
924デフォルトの名無しさん:2008/01/19(土) 12:40:10
Sum_Ave()なのにsumとaveにしないのはなぜなんだぜ。
925デフォルトの名無しさん:2008/01/19(土) 12:43:02
初心者お断り、FAQお断りで重箱の隅をつつくのがスレの趣旨なら
【規格】【議論】
926デフォルトの名無しさん:2008/01/19(土) 22:06:57
敢えてネガティブな見出しを付ける事で割と平和に質疑応答が続くスレもある
927デフォルトの名無しさん:2008/01/20(日) 08:21:17
重箱の隅というか、たまには規格の核心だったり
928デフォルトの名無しさん:2008/01/20(日) 08:40:25
>895 897 899
ありがとう

UNIXがcで書かれているときいたのですが
cでファイルの移動という概念がないならどんなカラクリでファイルを移動させてるんですかね
929デフォルトの名無しさん:2008/01/20(日) 09:56:34
全部 C ってわけじゃない
930デフォルトの名無しさん:2008/01/20(日) 10:04:47
>>928
あんたは辞書に載っていない単語は喋れないのか? そんなことはないだろ? つまりはそういうことだ。
931デフォルトの名無しさん:2008/01/20(日) 10:05:54
いいかげんスレ違いへのレスを止めろ
932デフォルトの名無しさん:2008/01/20(日) 11:17:18
long a,b,c
a = 501/500;
b = c / a;

これをfloatやdobleを使わずに1/1000まで計算したいんですけど
a = (501 * 1000)/500;
b= (c * 1000)/a;
で問題ないですよね?
933デフォルトの名無しさん:2008/01/20(日) 15:42:49
むしろ1000をかけることで何がどう問題なくなるのか知りたい
934デフォルトの名無しさん:2008/01/20(日) 15:46:53
小数点以下3桁まで求めたいのだろ。別にCの問題じゃないからスレ違いだと思うが。
935デフォルトの名無しさん:2008/01/20(日) 15:49:10
>>932
自分で電卓叩いてみるとよくわかるよ。
936デフォルトの名無しさん:2008/01/20(日) 15:55:55
longは整数型だからどうがんばっても1/1000までの計算はできません
937デフォルトの名無しさん:2008/01/20(日) 16:08:48
1000倍してもlongの最大値を越えない範囲ならいいんじゃないの?
938デフォルトの名無しさん:2008/01/20(日) 16:24:49
1/1000ってのは見ないことにするとして

>>932
ある
オーバーフローしないためにcに許される値の範囲が狭くなってしまう
素直に (500*c)/501 と書くか、あるいはもっと広い範囲を保証したいなら
500*(c/501)+(500*(c%501))/501などとする
939デフォルトの名無しさん:2008/01/20(日) 16:25:00
固定小数点でググれ
940デフォルトの名無しさん:2008/01/21(月) 01:00:26
Cプログラマ必須テキストです!

http://mori.eco.to/
941デフォルトの名無しさん:2008/01/21(月) 12:59:28
明示的に代入していない要素に 0 を代入したことにするには
struct hoge_tag hoge = {};
で十分?
それとも
struct hoge_tag hoge = { 0 };
せめて一つは指定しないとダメ?
942デフォルトの名無しさん:2008/01/21(月) 13:54:26
構造体に0を代入とな?
943デフォルトの名無しさん:2008/01/21(月) 13:55:55
944デフォルトの名無しさん:2008/01/21(月) 14:06:17
>>941
{}の中には一つ以上の初期化子が必要
945デフォルトの名無しさん:2008/01/21(月) 21:07:43
unsigned char型の文字列ををcharacter型に変換するには
どうすればできますか?
946デフォルトの名無しさん:2008/01/21(月) 21:14:55
character型とは何ですか?
947デフォルトの名無しさん:2008/01/21(月) 21:19:13
typedef unsigned char character;
948デフォルトの名無しさん:2008/01/21(月) 21:23:40
ならば変換する必要などないんじゃ
949デフォルトの名無しさん:2008/01/21(月) 21:31:42
いや、947は945に対する回答だから
950デフォルトの名無しさん:2008/01/21(月) 22:07:51
#include<stdio.h>
#define N 2;

typedef struct{


}Record;

void inputData(int n, Record r[]);
void outputData(int n, Record r[]);
void calcBMI(int n; Recordr[]);


int main(void)
{
Record rrr[];

int i;

printf("%d人まで処理します",N);
for(i=0;i<N;i++){
inputData(i,rrr);
outputData(i,rrr);
calcBMI(i,rrr);
printf("\n");
}

return 0;
}
951デフォルトの名無しさん:2008/01/21(月) 22:09:47
/*inputData関数の定義*/
void inputData(int n, Record r[]){
printf("%d人目の入力\n",n+1);
printf("名前は? →");scanf("%s", r[n].personal);
printf("生年月日は?(8桁)→");scanf("%s", r[n].birth);
printf("身長は?(cm) →");scanf("%lf", &r[n].height);
printf("体重は?(cm) →");scanf("%lf", &r[n].weight);
}
/*outputData関数の定義*/

/*calcBMIの定義*/


実行結果は
1人まで処理します
1人目の入力
名前は?     →hoge
生年月日は?   →19700917
身長は(cm)?   →174.5
体重は(kg)?  →69.5
1人目の出力
名前は      hoge
生年月日は 1970年09月17日
身長は  174.50cm
体重は  69.50kg
1人目のBMIは  22.82


Record型構造体の定義とoutputData関数の定義とcalcBMIの定義がよくわからないのですがどなたかわかりませんか?
BMIの計算内にはpower関数を利用しなくてはいけないんですが
↑の#define N 2は#define N 1 でおねがいします
952デフォルトの名無しさん:2008/01/21(月) 22:16:34
BMIとか、穴埋めとか、宿題のにおいがする
953デフォルトの名無しさん:2008/01/21(月) 22:16:41
>>950-951
>>1
> GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は
> 専門の別スレッド↓があるのでそこへさようなら。
>
> 【初心者歓迎】C/C++室 Ver.42【環境依存OK】
> http://pc11.2ch.net/test/read.cgi/tech/1188748806/
> C/C++の宿題を片付けます 95代目
> http://pc11.2ch.net/test/read.cgi/tech/1187944110/
954デフォルトの名無しさん:2008/01/21(月) 22:35:15
迷惑かけてすいません。ご誘導ありがとうございます
955デフォルトの名無しさん:2008/01/22(火) 00:51:10
Cの文字列操作で、接頭・接尾の空白文字列(タブ・改行・半角スペースなど)を削除したい場合、
一般的にどういう風にするのでしょうか?
956デフォルトの名無しさん:2008/01/22(火) 01:05:59
手抜きでsscanfで足りる場合もあるし
先頭部だったらisspaceでポインタずらすだけで済む場合もあるし
ケツを削るときは末尾から判定して非空白の直後を'\0'にすりゃいいし
書き換えできないなら当然コピーするし
957デフォルトの名無しさん:2008/01/22(火) 01:27:13
>>956
直近では、手抜きの sscanf でいけそうです。

どうもありがとうございました。
958955:2008/01/22(火) 01:37:52
>>956
isspaceを使ってコピーするなら、これでOK?

void trim(char *to, char *from)
{
while (isspace(*from)) {
*from++;
}
while (!isspace(*from)) {
*to++ = *from++;
};
*to = '\0';
};
959デフォルトの名無しさん:2008/01/22(火) 01:50:03
こうか?

void trim(char *to, char *from)
{
  while (*from && isspace(*from)) {
    *from++;
  }
  while (*from && !isspace(*from)) {
    *to++ = *from++;
  };
  *to = '\0';
};
960デフォルトの名無しさん:2008/01/22(火) 01:57:42
char *trim(char *s)
{
    while(isspace(*s)) s++;
    for(char *p = s; *p && !isspace(*p); p++) ; *p = '\0';
    return s;
}

961デフォルトの名無しさん:2008/01/22(火) 02:00:48
とちゅうに空白があったらおかしなことになるだろ
962デフォルトの名無しさん:2008/01/22(火) 02:32:26
char *trim(char *to, char *from)
{
  char *p;

  while(*from && isspace(*from)) from++;

  for(p=from; *p; p++);
  for(p--; from<p && isspace(*p); p--);

  while(from<=p) *to++ = *from++;
  *to='\0';

  return to;
}
963デフォルトの名無しさん:2008/01/22(火) 02:47:21
ctypes の関数に char を渡すときには unsigned char にキャストしてね。
964デフォルトの名無しさん:2008/01/22(火) 11:29:10
なぁ、もう初心者スレと統合でいいんじゃね?
965デフォルトの名無しさん:2008/01/22(火) 13:00:01
>>963
なぜでしょうか
理由を教えてください
966デフォルトの名無しさん:2008/01/22(火) 13:02:21
967デフォルトの名無しさん:2008/01/22(火) 13:19:45
>>966
ありがとうございました

ということは与えられる文字がASCIIの範囲ではないかもしれないとすれば
そもそもis〜だけでは正しく処理できない可能性があるということになりますね
968デフォルトの名無しさん:2008/01/23(水) 23:42:46
ファイルを読み込んだバッファ( char* file)があるのですが、
これから1行づつバッファ( char* line)に読み込みたいのですが、
どのようにすればよいでしょうか?

start = file;
while( NULL != ( end = strchr( start, '\n'))){
size_t size = ( size_t)(_aalineres->end - _aalineres->start);
line = ( char *)malloc( size + 1);
memcpy( line, start, size);
のようにかいたのですが、
main.c:12: warning: assignment makes integer from pointer without a cast
main.c:12: warning: comparison between pointer and integer
main.c:13: error: invalid operands to binary -
といわれてしまいます。 12行目はwhileの行です。
よろしくお願いします。
969デフォルトの名無しさん:2008/01/24(木) 00:09:04
>>968
スレ違い。初心者スレへでもどうぞ。

ちなみに、12行目はendが恐らくは整数型なので代入で警告が出て更に比較で警告が出ている。
13行目は、唐突に出てきた_aalineresのメンバstartやendが引き算できない型なのでエラーが出ている。
970デフォルトの名無しさん:2008/01/24(木) 00:11:55
すみません。 移動します。
aalineresは、コピー間違いでした。
971デフォルトの名無しさん:2008/01/24(木) 00:46:12
どこがスレ違いなんだろ。
972デフォルトの名無しさん:2008/01/24(木) 00:59:21
次スレはまだか
973デフォルトの名無しさん:2008/01/24(木) 07:53:25
>>972
次スレ

C言語なら俺に聞け(入門篇) Part 24
http://pc11.2ch.net/test/read.cgi/tech/1201083176/
【ISO/ANSI/JIS】移植性の高いC相談室 Part 133

このスレは標準C規格に合致した移植性の高い記法・技法に関するスレです。
GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそちらへ。

C言語なら俺に聞け(入門篇) Part 24
http://pc11.2ch.net/test/read.cgi/tech/1201083176/
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1200464091/
C/C++の宿題を片付けます 103代目
http://pc11.2ch.net/test/read.cgi/tech/1200318925/

【書き込む前に】
・まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
・質問する前には最低限検索を。
・エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

【参考文献】
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

【このスレのログ】
前スレ:http://pc11.2ch.net/test/read.cgi/tech/1190261457/
他の過去ログ:http://nssearch.hp.infoseek.co.jp/clang/

【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。
975デフォルトの名無しさん:2008/01/24(木) 12:19:47
スレタイがますます意味不明になってるぞw
あれじゃ勘違い質問がより増える
976デフォルトの名無しさん:2008/01/24(木) 13:07:43
【初心者お断り】ガチ規格準拠標準C専用スレ Part133
977デフォルトの名無しさん:2008/01/24(木) 13:34:41
なぁ、いつの間に
>このスレは標準C規格に合致した移植性の高い記法・技法に関するスレです。
なことになったんだよ?
978デフォルトの名無しさん:2008/01/24(木) 13:57:58
#define NAME "name"

char *char_name, *sprintf_name;
char_name = NAME;
sprintf( sprintf_name, "%s", NAME);

最下行の二つは同じ意味になるのでしょうか?
979デフォルトの名無しさん:2008/01/24(木) 14:18:18
「ハッカーのたのしみ」でわからない部分があったので教えてください。

p.70 のコード
x = (x & 0x55555555) + ((x >> 1) & 0x55555555); というコードで、

「(x & 0xAAAAAAAA) >> 1 ではなく、(x >> 1) & 0x55555555 としたのは、大きな定数二つがレジスタに置かれないようにするためである。」

とありますが、大きな定数がレジスタに置かれるとどんな問題が起こるのでしょうか?
実際、0xAAAAAAAA が 2 個レジスタに置かれた状態だと、どのレジスタにどんな値が入るのでしょうか?

また、レジスタの大きさにもよると思うのですが、レジスタに置かれるとまずいほど「大きな」定数の「大きな」を決める閾値は、どのくらいになりますか?

980デフォルトの名無しさん:2008/01/24(木) 14:28:05
>>977
もともとはなんだったの?
981デフォルトの名無しさん:2008/01/24(木) 14:30:00
>>978
片方はエラーになる。
つか、実行して確かめてみれば済むことだろう?
982デフォルトの名無しさん:2008/01/24(木) 14:33:43
>>978
あなたはまだC言語の仕様そのものをほとんど理解していないようです
初心者用のスレへどうぞ
983デフォルトの名無しさん:2008/01/24(木) 14:55:03
立てた

【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
984デフォルトの名無しさん:2008/01/24(木) 14:55:35
>>981
すみません。
両方ともエラーにはなっていません。
実行しても、期待通りの動作をしているので同じ意味なのか質問させて頂きました。
985デフォルトの名無しさん:2008/01/24(木) 14:56:17
>>984
違うし、たまたま動いてるだけのバグ入り
986デフォルトの名無しさん:2008/01/24(木) 14:58:40
違うと思うのなら、説明してやれば良いのに
987デフォルトの名無しさん:2008/01/24(木) 14:59:12
説明してやればいいと思うなら、自分でやればいいのに
988デフォルトの名無しさん:2008/01/24(木) 15:00:29
"違うと思うなら"説明してやれば良いのに

俺は違うとは思わんから説明できん
989984:2008/01/24(木) 15:03:13
エラーが出ると言うことだったので、エラーはでていません。 、と答えさせて頂きました。
問題があるのなら、説明して頂けませんでしょうか?
990デフォルトの名無しさん:2008/01/24(木) 15:03:41
>>979
ややこしい大きな定数をレジスタにロードするのはRISC系CPUでは面倒いから、
2回もロードしたくないってことじゃない?コードが長くなるしCPUサイクルも食うし
同じ値にしとけば1回のロードで済む
それ以外にまずいことは別段起きないかと
991デフォルトの名無しさん:2008/01/24(木) 15:06:33
【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。
992デフォルトの名無しさん:2008/01/24(木) 15:08:55
>>978
同じ意味になりません。
char_name = NAME; は、NAME を指すように char_name を変更する。char_name が指している先は変更しない。
sprintf(略); は、sprintf_name が指している先に NAME をコピーする。sprintf_name 自体は変更しない。
993デフォルトの名無しさん:2008/01/24(木) 15:09:53
バグとは何のことを言ってるんだろう
994デフォルトの名無しさん:2008/01/24(木) 15:13:24
sprintf_name の指している先がないことだろう
995デフォルトの名無しさん:2008/01/24(木) 15:14:49
初期化していないポインタの先に書き込んでうまく動くってあんまりなさそうなんだけど
特定の環境だとよくあったりするのかね
996デフォルトの名無しさん:2008/01/24(木) 15:18:01
いったいこのスレの何がそこまで気に食わないんだろう
997デフォルトの名無しさん:2008/01/24(木) 15:18:06
スレ最後の質問がこれか・・・入門スレと区別なんて必要ないぜ。

ってことで梅
998デフォルトの名無しさん:2008/01/24(木) 15:19:08
999デフォルトの名無しさん:2008/01/24(木) 15:19:42
>>979の二つの値ってのは0xAA…と0x55…の二種類って意味でいいのかな
1000デフォルトの名無しさん:2008/01/24(木) 15:20:39
1000ならD言語復権
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。