【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/09/20(木) 13:10:57まず問題を冷静に吟味して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/
【このスレ住人としての心得】
ビットシフトはなんの役に立つのでしょうか でググれ
0002デフォルトの名無しさん
2007/09/20(木) 13:23:05このスレは初心者スレではありません。Cの手練れが悩んで悩んでわからない事を
質問するスレです。スレのレベルに合わない低レベル質問は禁止です。
質問する前に先ず自分で最低1週間はいろいろ調べましょう。
K&Rに書かれているような事は質問しないこと
0003デフォルトの名無しさん
2007/09/20(木) 15:13:48もうこのスレが出て来る
ぐーぐるさんはえーマジはえー
0004デフォルトの名無しさん
2007/09/20(木) 22:42:27CHAR_BIT が 8 の処理系で fgetc( fp ) を読んだら何が返ってきますか?
0005デフォルトの名無しさん
2007/09/20(木) 22:51:13判定するにはどういう方法があるんでしょうか
インラインアセンブラ使うならオーバフローフラグ調べて終了なんですが、
C言語レベルでの検知方法を知りたいです
0006デフォルトの名無しさん
2007/09/20(木) 22:57:16でもDSP系のコンパイラなら書けます。
もっとも専用に拡張されているのかも知れませんが。
0007デフォルトの名無しさん
2007/09/20(木) 22:57:340008デフォルトの名無しさん
2007/09/20(木) 23:31:24だから、わからない。
ケースバイケースともいえる。
0009デフォルトの名無しさん
2007/09/20(木) 23:42:32if ((long long)a + b > INT_MAX) printf("overflow");
0010デフォルトの名無しさん
2007/09/21(金) 00:44:06a, b が負数のときはどうなんです?
0011デフォルトの名無しさん
2007/09/21(金) 00:46:260012デフォルトの名無しさん
2007/09/21(金) 05:37:53符号なしではオーバーフローは決して起きないので
(ラップアラウンドするのは仕様)検出できません。
符号ありでオーバーフローが起きた場合の動作は未定義なので、
処理系依存の検出方法が存在するかもしれませんが
一般にはやはり不可能です。
0013デフォルトの名無しさん
2007/09/21(金) 09:37:08void 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--];
}
こういうマージソートって後ろからマージしていく感じでしょうか?
あと、グローバル変数を使わずにポインタで領域確保していったほうが
いいでしょうか?
0014デフォルトの名無しさん
2007/09/21(金) 11:46:20たとえば UINT_MAX が 99999 の処理系があっても問題ないでしょうか?
最低値が 65535 という記述は見つけたのですが。
0015デフォルトの名無しさん
2007/09/21(金) 13:15:28「後ろからマージしていく感じ」ってなんだ、もっと厳密に話せ
でないと「お前がそう感じるならそうなんだろう」としか言えん
ソートできる配列の大きさに制限をかけたくないなら
必要に応じてallocするしかない
0016デフォルトの名無しさん
2007/09/21(金) 13:20:03左右どちらかの配列が終わったときの処理を別に書かなくていい分、短くかけることが利点
0018デフォルトの名無しさん
2007/09/21(金) 14:22:58int 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です。」と出ます。
なぜですか?
0019デフォルトの名無しさん
2007/09/21(金) 14:26:090020デフォルトの名無しさん
2007/09/21(金) 14:31:41最初のelseの後ろのifからreturnの手前までを{}で囲む
0021デフォルトの名無しさん
2007/09/21(金) 14:34:43int 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 )
とエラーがでます。
0022デフォルトの名無しさん
2007/09/21(金) 14:37:140023デフォルトの名無しさん
2007/09/21(金) 14:39:07thx!
0024デフォルトの名無しさん
2007/09/21(金) 19:04:29説明サイト、参考書があったら教えていただけませんか? JISX 3010の当該章の提示
でも結構です。
よろしくおねがいします。
0025デフォルトの名無しさん
2007/09/21(金) 19:36:51max=n1;
else
max=n2;
と
max=(n1>n2) ? n1:n2;
とはどう違いますか?
0026デフォルトの名無しさん
2007/09/21(金) 19:42:21結果は同じだが、後者の方が速い
0027デフォルトの名無しさん
2007/09/21(金) 19:45:190028デフォルトの名無しさん
2007/09/21(金) 19:45:310029デフォルトの名無しさん
2007/09/21(金) 19:48:430030デフォルトの名無しさん
2007/09/21(金) 19:51:330031デフォルトの名無しさん
2007/09/21(金) 19:55:48これって()要らないんじゃない?
max=n1>n2 ? n1:n2;
でいいんじゃない?
0032デフォルトの名無しさん
2007/09/21(金) 20:07:42同じ
>>31
いい
0033デフォルトの名無しさん
2007/09/21(金) 20:39:350034デフォルトの名無しさん
2007/09/21(金) 21:13:07const char** p1; //charを修飾
char* const * p2; // char *を修飾
const char* const * p3; //charと char *を修飾
ならば
**p1がconst
*p2がconst
*p3と**p3がconst
だと想う。
0035デフォルトの名無しさん
2007/09/21(金) 21:15:48ttp://kmaebashi.com/programmer/pointer.html
0036デフォルトの名無しさん
2007/09/21(金) 22:17:52は
(num)?printf("その数は0ではない。"):printf("その数は0。");
のほうがいいですか?
0037デフォルトの名無しさん
2007/09/21(金) 22:27:470038デフォルトの名無しさん
2007/09/21(金) 22:30:560039デフォルトの名無しさん
2007/09/21(金) 22:32:01どうでもいい。
0040デフォルトの名無しさん
2007/09/21(金) 22:33:48ユニコード(UTF16)では0x0000〜0xffffまでの値が文字の領域として
定義されているらしいですが、WEOFは0xffffと定義されています。
これだと文字とWEOFを区別できない様な気がするのですが、
0xffffの文字は存在しないと考えてよいのでしょうか?
ここを見ると一応未使用となっていますが、気持ち悪いです。
http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_F000-FFFF
なんでEOFじゃなくWEOFになったんでしょうね。
0041デフォルトの名無しさん
2007/09/21(金) 22:33:49printfの戻り値を利用するのなら丸っきり否定はしないが。
0042デフォルトの名無しさん
2007/09/21(金) 22:37:22()はつける必要ないのですか?
0043デフォルトの名無しさん
2007/09/21(金) 22:39:01でOKなら、
(num)?printf("その数は0ではない。"):printf("その数は0。");
もOKですよね?
max=n1>n2 ? n1:n2;
がOKなら、
num?printf("その数は0ではない。"):printf("その数は0。");
はOKですよね?
どっちが適切ですか?
0044デフォルトの名無しさん
2007/09/21(金) 22:41:09どうでもいいよ。
0045デフォルトの名無しさん
2007/09/21(金) 22:41:17そうなんですか。それなら、基本的にif-elseを使えばいいんですね。
0046デフォルトの名無しさん
2007/09/21(金) 22:41:540047デフォルトの名無しさん
2007/09/21(金) 22:42:32ほっといてやれ
知ったばかりで使いたい年頃なんだ
0048デフォルトの名無しさん
2007/09/21(金) 22:43:29教科書に載っていたので、条件演算子を使ったんです。
でも、あまり使われていないんですね。
if-elseのほうがいいんですよね?
0049デフォルトの名無しさん
2007/09/21(金) 22:45:41演算子の優先順位について調べろ。
?:と=と>でどれがより優先されるか。
0050デフォルトの名無しさん
2007/09/21(金) 22:49:56異論もあるだろうけど、if文を使った方が読みやすい場合が多いと思う。
?:を使ってコンパクトに書いた方がいいという積極的な理由がなければif文を選択した方が無難だと思う。
0051デフォルトの名無しさん
2007/09/21(金) 22:49:56はNG
maxにn1が入る
0052デフォルトの名無しさん
2007/09/21(金) 22:55:27それはどんな処理系?
0053デフォルトの名無しさん
2007/09/21(金) 22:56:16C/C++処理系ではないことは確か
0054デフォルトの名無しさん
2007/09/21(金) 22:57:28>>49
005540
2007/09/21(金) 22:57:350056デフォルトの名無しさん
2007/09/21(金) 22:59:24知るかヴォけ
0057デフォルトの名無しさん
2007/09/21(金) 23:01:16>>40 のリンク先をもう一度よく見なおしてみれば満足できるかも
0058デフォルトの名無しさん
2007/09/21(金) 23:01:42だから、
max=(n1>n2)?n1:n2;
がいいよ。()をつけるべき。
0059デフォルトの名無しさん
2007/09/21(金) 23:01:49異論もあるだろうけど、ここは条件演算子の是非を今更議論するような
幼稚なスレなので、他を当たって下さい。ちなみに自分もわかりませんので。
0060デフォルトの名無しさん
2007/09/21(金) 23:06:03芸風真似すんなww
0061デフォルトの名無しさん
2007/09/21(金) 23:08:03ホレ。ググってきてやったぞ。
コレ見て落ち着いて来い。な?
ttp://www.bohyoh.com/CandCPP/C/operator.html
0062デフォルトの名無しさん
2007/09/21(金) 23:09:57頭悪いな。
16bit処理系だとEOFも0xffffなんだよ。
判る?
たとえると実際のハードウェアやOSでNULLの0を示す
アドレス付近を読み出し専用にして不正なアドレスをトラップする仕組みと同じ。
0063デフォルトの名無しさん
2007/09/21(金) 23:12:17分かってないのはお前じゃないのか?
006440
2007/09/21(金) 23:15:06よくわかった。
けど、wikipediaなんて信用すんなこのアホが!
って人もいるけど、その辺どうよ?
俺は信用したが。
0065デフォルトの名無しさん
2007/09/21(金) 23:15:170xfffe, 0xffffはアプリケーション定義
0066デフォルトの名無しさん
2007/09/21(金) 23:18:34wchar_tなのかよ
やべえwwww
0067デフォルトの名無しさん
2007/09/21(金) 23:28:56wchar_tはunsigned shortになってるから、WEOFの時だけ
short→intとキャストすればEOFと共有できるよ。
0068デフォルトの名無しさん
2007/09/21(金) 23:37:130069デフォルトの名無しさん
2007/09/21(金) 23:41:13WEOFの時だけ、って条件だと、
int my_fputwc(wint_t c, FILE *fp)
{ wint_t r = fputwc(c, fp);
return (r == WEOF) ? EOF : r;
}
みたいな書き方しかないと思うけど、
これを条件分岐させずに書く方法ってある?
0070デフォルトの名無しさん
2007/09/21(金) 23:46:38void 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");
}
}
0071デフォルトの名無しさん
2007/09/21(金) 23:47:23string: 0 line = JAPAN
string: 1 line = USA
string: 2 line = FRANCE
となるのですが、どうしても
*((*sp) + j)
の部分できちんと処理されてるのかわかりません
この書き方だと配列strの最初の「J」にjの値を足すことになるのでは?
なぜきちんとアドレスに1足したように処理されているのでしょうか?
0072デフォルトの名無しさん
2007/09/21(金) 23:51:36増えるたびに
J A P A N
と順に指してる
0073デフォルトの名無しさん
2007/09/21(金) 23:59:02int 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我慢できれば。
0074デフォルトの名無しさん
2007/09/22(土) 00:06:00ポインタの型スケーリング
0075デフォルトの名無しさん
2007/09/22(土) 00:32:37返答ども!
やってることは確かにそうなんですよねぇ
なんで*(sp + j)でやると異常終了するんでしょう?
アドレスを1づつ増やして、*でその1増えたアドレスを差せば
順番に出力されてもいいはずなのになぁ
0076デフォルトの名無しさん
2007/09/22(土) 00:40:34どこから引っ張ってきたソースだかしらんけど
spは要素7のcharの配列へのポインタだから*spは要素7のcharの配列そのものを意味するけど
これは直ちに要素7のcharの配列の先頭要素へのポインタつまりcharへのポインタに成り下がるので、
これにjを足せばそれは要素7のcharの配列の先頭要素から数えてj個目の要素を指すポインタになるから
*(*sp+j)は要素7のcharの配列の先頭要素から数えてj個目の要素を意味する
0077デフォルトの名無しさん
2007/09/22(土) 00:44:06spは要素7のcharの配列へのポインタだから、
これに1を足すと要素7のcharの配列のサイズぶん後を指す
charのサイズぶん後を指させたいならcharへのポインタにしなければならない
0078デフォルトの名無しさん
2007/09/22(土) 00:44:21有効なのはsp+0〜sp+2 の間だけ
spに1足すと
[JAPAN\0\0]
→[USA\0\0\0\0]
[FRANCE\0]
に移動する
JAPANの'A'に移動するわけじゃない
0079デフォルトの名無しさん
2007/09/22(土) 00:49:13sp[i][j] みたいに参照するんだけどな
なんだこのソース
それとも訓練用にわざとわかりにくい書き方をしてるのか
008075
2007/09/22(土) 01:11:26spは配列strの先頭アドレスが入ってて、1足せば次の文字が出るもんだと思ってた
今の場合は2次元配列で要素数が7だからsp+1だと7つ分一気にずれるのか
で、*spにすることでcharへのポインタになり、1足せば次の要素に行く。と・・・
こんな感じであってるんでしょうか?
0081デフォルトの名無しさん
2007/09/22(土) 03:19:35> 定義されているらしいですが、WEOFは0xffffと定義されています。
このそもそも間違いだらけの文章に誰も突っ込まないってどうよ
0082デフォルトの名無しさん
2007/09/22(土) 04:28:280083デフォルトの名無しさん
2007/09/22(土) 04:30:29なぜか唐突にUnicodeが出てくる
WEOFは0xffffとは限らない
0084デフォルトの名無しさん
2007/09/22(土) 10:19:030085デフォルトの名無しさん
2007/09/22(土) 10:42:54あってる
0086デフォルトの名無しさん
2007/09/22(土) 10:56:34objを標準のlibフォルダに入れておけばコンパイル速いですか?
0087デフォルトの名無しさん
2007/09/22(土) 11:09:52printfとかは必要なlibファイルを勝手に読み込みますよね?
0088デフォルトの名無しさん
2007/09/22(土) 11:14:15C言語そのものとは関係ない
0089デフォルトの名無しさん
2007/09/22(土) 11:21:32>objと lib は同じようなものですか?
Windowsのlibの話ならlibはobjのアーカイブ
>objを標準のlibフォルダに入れておけばコンパイル速いですか?
関係ない
>>87
ムリ
>printfとかは必要なlibファイルを勝手に読み込みますよね?
gccならlibc、VCならCRTが自動的にリンクされるだけで、ヘッダファイルとは関係ない
0090デフォルトの名無しさん
2007/09/22(土) 12:09:330091デフォルトの名無しさん
2007/09/22(土) 12:12:150092デフォルトの名無しさん
2007/09/22(土) 12:14:34C#
0093デフォルトの名無しさん
2007/09/22(土) 13:46:57A==B==C
で比較できますか?
0094デフォルトの名無しさん
2007/09/22(土) 13:50:050095デフォルトの名無しさん
2007/09/22(土) 13:50:520096デフォルトの名無しさん
2007/09/22(土) 13:52:200097デフォルトの名無しさん
2007/09/22(土) 13:52:430098デフォルトの名無しさん
2007/09/22(土) 13:59:01お前バカだなぁ
わかってないんだから出てくるなよ
0099デフォルトの名無しさん
2007/09/22(土) 16:13:400100デフォルトの名無しさん
2007/09/22(土) 16:15:380101デフォルトの名無しさん
2007/09/22(土) 16:23:290102デフォルトの名無しさん
2007/09/22(土) 16:54:140103デフォルトの名無しさん
2007/09/22(土) 17:21:48>複数の関数が入っているlibファイルを作って、<***.h>と書いたとき自動的に必要なlibファイルを読み込むように出来ますか?
Visual C++ なら、ヘッダファイルに次のように書いておけば、mylib.libがリンクされる。
#pragma comment(lib, "mylib.lib")
0104デフォルトの名無しさん
2007/09/22(土) 17:35:38スレ違いは誘導しましょう。
0105デフォルトの名無しさん
2007/09/22(土) 18:28:21負の整数 A を A の型と同じサイズか大きいサイズの符号無し整数 B に変換するとき
処理系の負の整数の表現がどうであれ B は A の 2 の補数表現と同じビットパターン
になると考えてもいいですか?
0106デフォルトの名無しさん
2007/09/22(土) 18:36:22だから、符号拡張が起きるかどうか(が聞きたいのだろうがそれ)も処理系による。
0107デフォルトの名無しさん
2007/09/22(土) 18:38:4132bit signed int が INT_MIN
10000000000000000000000000000000
だったとして、それを64bit unsigned long longに代入したら
1111111111111111111111111111111110000000000000000000000000000000
だわな。
| B は A の 2 の補数表現と同じビットパターン
| になると考えてもいいですか?
だから、この答えはNoかな。
0108デフォルトの名無しさん
2007/09/22(土) 18:58:19負数の表現方法にかかわらず同じ結果になるんじゃないですか?
0109デフォルトの名無しさん
2007/09/22(土) 19:00:18規格の文言を一字一句たがわず書いてみて
0110デフォルトの名無しさん
2007/09/22(土) 19:06:05> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
> 型のサイズが同じ処理系なら
>>105と前提が変化した件について。相手にするの止めようかな。
0111デフォルトの名無しさん
2007/09/22(土) 19:18:170112デフォルトの名無しさん
2007/09/22(土) 19:22:00http://www.freewebs.com/photoradio/?0/1103271
0113デフォルトの名無しさん
2007/09/22(土) 19:27:03と
if (sa>=11 || sa<=-11)
は同じですか?
0114デフォルトの名無しさん
2007/09/22(土) 19:29:12sa が整数型なら
0115デフォルトの名無しさん
2007/09/22(土) 19:33:15JIS X 3010-1993 は会社にしかないし紙しかなく文が長いので
ここに書くには手間がかかりすぎます。
0116デフォルトの名無しさん
2007/09/22(土) 19:42:48お前宿題スレでしつこく書いてるバカだろ
お前だけだぞ、わかってないの
0117デフォルトの名無しさん
2007/09/22(土) 19:45:33身勝手な奴だな
0118デフォルトの名無しさん
2007/09/22(土) 20:08:10私は四捨五入が行われるものと思っていましたが、
X3014 : 2003 7.19.6.1には「この変換は適切な桁数への値の丸めも行う」と書かれているのみです。
この丸めもFLT_ROUNDSに従うものなのでしょうか。
あるいは、私が見落としただけで、ほかの箇所で規定されているのでしょうか。
0119デフォルトの名無しさん
2007/09/22(土) 20:13:55こんなとこまで来ててフイタ
0120デフォルトの名無しさん
2007/09/22(土) 20:24:25ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
0121デフォルトの名無しさん
2007/09/22(土) 20:25:21ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
0122デフォルトの名無しさん
2007/09/22(土) 20:25:47ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
0123デフォルトの名無しさん
2007/09/22(土) 20:35:32ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑
0124デフォルトの名無しさん
2007/09/22(土) 20:38:03ネット社会が生み出した
これも一つの Stand Alone Comlex か(笑)
0125デフォルトの名無しさん
2007/09/22(土) 20:44:23間違い探しか?
0126デフォルトの名無しさん
2007/09/22(土) 21:01:220127デフォルトの名無しさん
2007/09/22(土) 21:02:33C90 ではなく C99 であるが ttp://www.jisc.go.jp/app/pager?id=26811 の
6.3.1.3 に同じような内容がある。
UINT_MAX が 65535 のとき (unsigned int)(-1) は 65535 ということに
ならないでしょうか?
0128デフォルトの名無しさん
2007/09/22(土) 22:13:220129デフォルトの名無しさん
2007/09/22(土) 22:13:340130デフォルトの名無しさん
2007/09/22(土) 22:36:410131デフォルトの名無しさん
2007/09/22(土) 22:52:49それ以外はif
というか全部if、else ifでも別に
0132デフォルトの名無しさん
2007/09/22(土) 22:58:04具体的に教えてください。
0133デフォルトの名無しさん
2007/09/22(土) 22:59:41具体的に聞いてください。
0134デフォルトの名無しさん
2007/09/22(土) 23:00:20というのが良く分かりません。
0135デフォルトの名無しさん
2007/09/22(土) 23:05:310136デフォルトの名無しさん
2007/09/22(土) 23:07:420137デフォルトの名無しさん
2007/09/22(土) 23:09:55if(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{
.....
}
0138デフォルトの名無しさん
2007/09/22(土) 23:16:340139デフォルトの名無しさん
2007/09/22(土) 23:17:04でもやっぱりそこまでして使うくらいならifを使ったほうがいい
0140デフォルトの名無しさん
2007/09/22(土) 23:19:48皮肉なんか言ってないで教えたらどうなの。
0141デフォルトの名無しさん
2007/09/22(土) 23:43:390142デフォルトの名無しさん
2007/09/23(日) 00:01:27整数に丸める整数演算はどのようにすればいいでしょうか?
Windows なら右シフトで x >> n のようにできますが処理系定義なので
一般的には右シフトではできないようですが。
0143デフォルトの名無しさん
2007/09/23(日) 01:23:10x / (1 << n)
0144デフォルトの名無しさん
2007/09/23(日) 01:28:14それだと負の数が0方向に丸められないか?
0145デフォルトの名無しさん
2007/09/23(日) 01:43:54んじゃ、負の数ん時は条件分岐して適当にやっておいて。
0146デフォルトの名無しさん
2007/09/23(日) 02:38:31ファイルが見つかりません。
ならない。
0147デフォルトの名無しさん
2007/09/23(日) 02:39:260148デフォルトの名無しさん
2007/09/23(日) 02:43:260149デフォルトの名無しさん
2007/09/23(日) 02:46:46何でそう思うか、きみが前提としている諸条件と共に述べよ。
0150デフォルトの名無しさん
2007/09/23(日) 03:22:220151デフォルトの名無しさん
2007/09/23(日) 04:45:40それはむしろ俺が>>127に言いたいんだが
0152デフォルトの名無しさん
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);
}
0153デフォルトの名無しさん
2007/09/23(日) 10:14:31case 0:puts("偶数");break;
case 1:puts("奇数");break;
}
↓
puts((no%2)?"奇数":"偶数");
0154デフォルトの名無しさん
2007/09/23(日) 10:15:26#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);
}
0155デフォルトの名無しさん
2007/09/23(日) 10:16:26条件演算子は、見にくくなるから使わないほうがいいって言われたんですが、どうなんでしょうか?
0156デフォルトの名無しさん
2007/09/23(日) 10:21:29そらぁさすがに、defaultはエラー処理に使うべきじゃね?
0157デフォルトの名無しさん
2007/09/23(日) 10:22:56>>153が見にくい?
0158デフォルトの名無しさん
2007/09/23(日) 10:27:140159デフォルトの名無しさん
2007/09/23(日) 10:39:460160デフォルトの名無しさん
2007/09/23(日) 10:40:00参照。
0161デフォルトの名無しさん
2007/09/23(日) 10:41:06/*月の季節を表示 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);
}
0162デフォルトの名無しさん
2007/09/23(日) 10:56:22バグがある
0163デフォルトの名無しさん
2007/09/23(日) 11:08:22何故これを書いたの?この後に質問が続くのか?
先に意図を書いて欲しい...
0164デフォルトの名無しさん
2007/09/23(日) 11:15:23case 1:
case 2:puts("冬です。");break;
の間違い?
0165デフォルトの名無しさん
2007/09/23(日) 11:31:54多分>>134の例だろ
0166デフォルトの名無しさん
2007/09/23(日) 12:42:426.5.3.3 単項演算子-の結果は,その(拡張された)オペランドの符合を反転した値とする。
オペランドに対して整数拡張を行い,その結果は,拡張された型を持つ。
拡張された型で負数を表現できない場合にどうなるかの記述を見つけることができ
なかったが,拡張された型に変換されると考えれば
(unsigned int)(-1) と -(unsigned int)1 は同じ結果になるんじゃないか?
0167デフォルトの名無しさん
2007/09/23(日) 13:36:46の\aはどんな意味がありますか?
0168デフォルトの名無しさん
2007/09/23(日) 13:41:27ビープ音を1回鳴らす。
0169デフォルトの名無しさん
2007/09/23(日) 13:53:52実際の動作は処理系依存。
ビープ音もあれば画面をフラッシュさせることもあるらしい。
0170デフォルトの名無しさん
2007/09/23(日) 14:11:570171デフォルトの名無しさん
2007/09/23(日) 16:08:05int sum;
no=1;
sum=2;
と
int no=1;
int sum=2;
は同じですか? どちらを使うべきですか?
0172デフォルトの名無しさん
2007/09/23(日) 16:09:390173デフォルトの名無しさん
2007/09/23(日) 16:23:02それはないやろ。
0174デフォルトの名無しさん
2007/09/23(日) 16:23:550175デフォルトの名無しさん
2007/09/23(日) 16:25:57そうなんですか。前者を使うほうがいいんですね。
0176デフォルトの名無しさん
2007/09/23(日) 16:33:04いいえ。後者を使うべきです。
0177デフォルトの名無しさん
2007/09/23(日) 16:33:330178デフォルトの名無しさん
2007/09/23(日) 16:38:370179デフォルトの名無しさん
2007/09/23(日) 16:38:430180デフォルトの名無しさん
2007/09/23(日) 16:39:560181デフォルトの名無しさん
2007/09/23(日) 17:05:35質問者です。それは本当ですか?
ということは、前者を使ったほうがいいってことですか?
どうなんでしょうか?
0182デフォルトの名無しさん
2007/09/23(日) 17:09:43C89とC99あたりの違いで言ってるんだろうけど本当だよ
0183デフォルトの名無しさん
2007/09/23(日) 17:11:06その場合も前者を使ったほうがいいですか?
0184デフォルトの名無しさん
2007/09/23(日) 17:12:060185デフォルトの名無しさん
2007/09/23(日) 17:13:22ってなってます
0186デフォルトの名無しさん
2007/09/23(日) 17:14:37です。
0187デフォルトの名無しさん
2007/09/23(日) 17:43:050188デフォルトの名無しさん
2007/09/23(日) 17:45:330189デフォルトの名無しさん
2007/09/23(日) 17:55:52(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) からね。
0190デフォルトの名無しさん
2007/09/23(日) 18:11:50いいえ、後者を使うべき理由ならあります。
宣言以降代入までの不定値が存在する期間を排除することができるというのがそれです。
0191デフォルトの名無しさん
2007/09/23(日) 18:21:320192デフォルトの名無しさん
2007/09/23(日) 18:26:22互換性を切り捨てるには時期尚早
0193デフォルトの名無しさん
2007/09/23(日) 18:29:230194デフォルトの名無しさん
2007/09/23(日) 18:46:58初期化を怠ると、後でひでーめに遭うんだよ!
むしろ初期化は強制すべきなんだよ!
0195デフォルトの名無しさん
2007/09/23(日) 18:51:240196デフォルトの名無しさん
2007/09/23(日) 18:54:370197デフォルトの名無しさん
2007/09/23(日) 18:59:33ありがとうございます。勉強になりました。
0198デフォルトの名無しさん
2007/09/23(日) 20:01:38私をお呼びですか?フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
0199デフォルトの名無しさん
2007/09/23(日) 20:02:50代入を禁止したらいい。
0200デフォルトの名無しさん
2007/09/23(日) 20:09:43・変数への代入は可能な限り行わない(変数を使いまわさない)
でもコンテナとかポインタ先への間接代入はしょうがないよね。
0201デフォルトの名無しさん
2007/09/23(日) 20:24:460202デフォルトの名無しさん
2007/09/23(日) 20:41:260203デフォルトの名無しさん
2007/09/23(日) 21:14:28>>192
どこに初期化ができないCコンパイラがあるというんだ?
だれもブロックの途中だなんて一言も言ってないわけで、宣言できる場所でなら初期化代入は必ずできるわけだが。
0204デフォルトの名無しさん
2007/09/23(日) 21:29:25struct s a = {...}; /* これはいける */
struct s b = a; /* こっちはエラー */
0205デフォルトの名無しさん
2007/09/23(日) 21:31:01スレタイに注目。
0206デフォルトの名無しさん
2007/09/23(日) 21:46:28こいつ最高にアホ。
0208デフォルトの名無しさん
2007/09/23(日) 22:03:510209デフォルトの名無しさん
2007/09/23(日) 22:08:320210デフォルトの名無しさん
2007/09/23(日) 22:15:17メモリ上のレイアウトを意図したビットフィールドの使い方には移植性に問題があります。
ビット演算を使うかどうかは、あんまり関係ないでしょう。
0211209
2007/09/23(日) 22:47:20どうもありがとう。
ちなみに、処理速度的にはやっぱりビットフィールド使うとたいていの場合遅くなるもんですか?
どっちみち今やってるプログラムはメモリの制約があるので使わざるを得ないんですが…
0212デフォルトの名無しさん
2007/09/23(日) 22:55:49遅くなることのほうが多いだろうけど、使い方とコンパイラの実装の相性による。
速度は実測が基本。
0213デフォルトの名無しさん
2007/09/24(月) 17:19:46http://pc11.2ch.net/test/read.cgi/tech/1190555031/
0214デフォルトの名無しさん
2007/09/24(月) 21:50:470215デフォルトの名無しさん
2007/09/24(月) 21:55:110216デフォルトの名無しさん
2007/09/24(月) 21:59:26ありがとう。
0217デフォルトの名無しさん
2007/09/25(火) 15:39:42int dig;
とint sum,dig;
とはどう違いますか?
0218デフォルトの名無しさん
2007/09/25(火) 15:59:300219デフォルトの名無しさん
2007/09/25(火) 16:17:390220デフォルトの名無しさん
2007/09/25(火) 16:19:400221デフォルトの名無しさん
2007/09/25(火) 17:04:51不可能
>>220
whileとforの仕様を本当に理解していたらそんな出るはずない
教科書読み直せ
0222デフォルトの名無しさん
2007/09/25(火) 17:05:22○そんな質問
0223デフォルトの名無しさん
2007/09/25(火) 18:10:200225デフォルトの名無しさん
2007/09/25(火) 21:46:08system("sleep
0226デフォルトの名無しさん
2007/09/25(火) 21:57:020227デフォルトの名無しさん
2007/09/26(水) 00:47:34int の負数の表現が 2 の補数で short の負数の表現が 1 の補数
という処理系はありえますか?
0228デフォルトの名無しさん
2007/09/26(水) 01:08:580229デフォルトの名無しさん
2007/09/26(水) 01:39:470230デフォルトの名無しさん
2007/09/26(水) 01:46:44ロジン貸そうか
0231デフォルトの名無しさん
2007/09/26(水) 15:21:00int while;
int for;
とかintに関数を使ってもいいですか?
0232デフォルトの名無しさん
2007/09/26(水) 15:23:13gotoもwhileもforも関数じゃないが、予約語は変数名に使えない。
0233デフォルトの名無しさん
2007/09/26(水) 15:43:22int 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);
}
これどこがミスってますか?
0234デフォルトの名無しさん
2007/09/26(水) 15:43:33thx!
0235デフォルトの名無しさん
2007/09/26(水) 15:44:21ですね。thx!
0236デフォルトの名無しさん
2007/09/26(水) 19:11:09ってどういう意味?
0237デフォルトの名無しさん
2007/09/26(水) 19:16:18contだけのときは、0
!contは!0ってこと。
だから、0以外
0238デフォルトの名無しさん
2007/09/26(水) 19:55:47!contっていう部分です
0239デフォルトの名無しさん
2007/09/26(水) 19:58:110240デフォルトの名無しさん
2007/09/26(水) 20:00:13???
>>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);
0241デフォルトの名無しさん
2007/09/26(水) 20:03:210242デフォルトの名無しさん
2007/09/26(水) 20:08:260243デフォルトの名無しさん
2007/09/26(水) 20:08:32while(cont)は、contが0以外だったらループする。
while(!cont)は、「contが0以外」以外だったら、つまり0だったらループする。
0244デフォルトの名無しさん
2007/09/26(水) 20:12:15どういう意味?
0245デフォルトの名無しさん
2007/09/26(水) 20:28:37while ( ! (cont) )
こう書けば分かるかね?論理否定演算子あたりでググってくれ。
0246デフォルトの名無しさん
2007/09/26(水) 21:15:220247デフォルトの名無しさん
2007/09/26(水) 21:20:060248デフォルトの名無しさん
2007/09/26(水) 23:02:380249デフォルトの名無しさん
2007/09/27(木) 00:37:500250デフォルトの名無しさん
2007/09/27(木) 14:54:01X x = A;
Y* y = (Y*)&x;
のあと
(Y)x と *y は同じ結果になりますか?
または ISO/IEC 9899:1990 のどのあたりで分かりますか?
0251デフォルトの名無しさん
2007/09/27(木) 15:18:35>unsigned 付き
0252デフォルトの名無しさん
2007/09/27(木) 16:13:37int 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);
}
を採点してください。こうしたほうが、スマートだよとか、
速いよ、とかあれば教えてください。
0253デフォルトの名無しさん
2007/09/27(木) 16:57:42・個数を回すループは 0 から n 未満とするのが一般的。
・forの中味の行が変わるなら括っておくのが無難。
・一文字変数は避けた方がいい。
・(0)は意味がないので 0 で充分。
0254デフォルトの名無しさん
2007/09/27(木) 17:04:09>>1
> GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は
> 専門の別スレッド↓があるのでそこへさようなら。
0255デフォルトの名無しさん
2007/09/27(木) 18:35:24このようなtoy programなら、scanfを使っていけない理由はない。
ループ制御変数はi,jのように1文字にするのが原則。無駄にcounterのようにすると返って読みにくい。
0256デフォルトの名無しさん
2007/09/27(木) 18:50:050257デフォルトの名無しさん
2007/09/27(木) 19:15:16strtok()とsscanf()では、どちらを使う方がいいですか?
あるいはもっといい方法ありますか?
0258デフォルトの名無しさん
2007/09/27(木) 20:02:16基本的にscanfファミリーはガッチリフォーマットの決まったレコードや
データが空白で区切られたレコードを読むのに最適に出来ている
カンマ区切りの可変長データは、それが全部数値ならいいが、
文字列が混ざってると厄介なことになりやすいので、
そういう場合にはstrtokを使ったほうが楽な場合も多い
あとは具体的なデータの内容によるとしか言えないが、
"str,ing",255, …みたいなものまで読める完全に汎用なものを作りたいなら
strtokでもsscanfでもなく頭っから一文字ずつ読んで解釈するしかない
0259デフォルトの名無しさん
2007/09/27(木) 20:02:30int 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;
}
0260デフォルトの名無しさん
2007/09/27(木) 20:40:43C99だね
0261デフォルトの名無しさん
2007/09/27(木) 22:23:26scanf("%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++)
の解説をお願いします。
0262デフォルトの名無しさん
2007/09/27(木) 22:24:24ピラミッドにもいろいろあるので、一概には答えられません。
なんて冗談は兎も角、>1を読んで初心者スレへどうぞ。
0263デフォルトの名無しさん
2007/09/27(木) 22:26:22thx! 移動します
0264デフォルトの名無しさん
2007/09/28(金) 00:18:10そもそも長方形であるためには width>0 && height>0 でないといけないんだから
それをチェックすべきじゃないのか?
0265デフォルトの名無しさん
2007/09/28(金) 01:35:27同じ結果になるとは言えない。
と 6.2.6.2 を読んで思った。
0266デフォルトの名無しさん
2007/09/28(金) 22:25:05文字列ライブラリと、エラーラーブラリのヘッダで、
文字列ライブラリでエラーがあったらエラーライブラリの関数、
エラーライブラリ内では文字列ライブラリを使ってます。
頭が再帰でどうにかなりそおです。
0267デフォルトの名無しさん
2007/09/28(金) 22:26:38どっちかに自分のプロトタイプを置く方法は使いたくありません。
メンテが面倒なのでね。
0268デフォルトの名無しさん
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
--
0269デフォルトの名無しさん
2007/09/28(金) 23:18:55文面からすると、関数の呼び出しをヘッダ内で行っている(つまり「定義」を書いている)???
通常は、ヘッダには、関数の[宣言のみ]書き、定義は別にするから、
互いに参照し合う必要はないはず。
0270デフォルトの名無しさん
2007/09/28(金) 23:41:32もー
C++だってインラインで定義してんじゃん
分けるの面倒なの!
0271デフォルトの名無しさん
2007/09/28(金) 23:44:20それじゃダメだっつってんだろ
0272デフォルトの名無しさん
2007/09/29(土) 00:10:392つのソースファイルで同じヘッダを読み込んだ時点で
関数の2重定義でリンク通らなくなるだろ。
相互参照云々以前に根本的にバグってる。
0273デフォルトの名無しさん
2007/09/29(土) 00:18:55ライブラリ使う側からなら何の問題もなし。
バグってるのはお前の頭。
0274デフォルトの名無しさん
2007/09/29(土) 00:25:01コンパイル出来ない両ライブラリとライブラリを使ってる部分のソース一式どっかにアップするか
日本語勉強し直すか、どっちかにしてくれ。
0275デフォルトの名無しさん
2007/09/29(土) 00:26:01うぜー
0276デフォルトの名無しさん
2007/09/29(土) 00:28:43そう邪険にするなよ
0277デフォルトの名無しさん
2007/09/29(土) 00:29:250278デフォルトの名無しさん
2007/09/29(土) 00:29:300279デフォルトの名無しさん
2007/09/29(土) 00:29:390280デフォルトの名無しさん
2007/09/29(土) 00:37:26んで、片方は#include1行の適当なヘッダ名でっち上げる。
ソース管理楽だよ。
0281デフォルトの名無しさん
2007/09/29(土) 00:42:48今まさにそうしてるんだよね
気持ち悪いから変えたかったんだけど
いまのとこそれしか思いつかない
ほんとアホばっかだなここ・・・
0282デフォルトの名無しさん
2007/09/29(土) 02:26:200283デフォルトの名無しさん
2007/09/29(土) 02:30:16メンテが面倒だからプロトタイプ書かないとか
気持ち悪いなら他の言語使えば?
0284デフォルトの名無しさん
2007/09/29(土) 02:36:140285デフォルトの名無しさん
2007/09/29(土) 02:54:46そう考えると哀れみだけしか浮かんでこないので笑ってスルーできるよ。
0286デフォルトの名無しさん
2007/09/29(土) 05:58:54プロトタイプ宣言と定義が一致しないとエラーになるISO/ANSI/JIS Cはおかしい
K&R時代の仕様に戻すべきだとか?
0287デフォルトの名無しさん
2007/09/29(土) 06:37:27機械にやらせられるところは極力機械にやらせるという発想がないやつはプログラマには向いてないな。
0288デフォルトの名無しさん
2007/09/29(土) 21:53:36バウンダリ文字列で区切られたデータを切り出す際の定跡的な物はありますか??
いまは、
・CRLFCRLFとなった時点をデータの始まり
・すべて書き込んだ後、CRLFまで戻ってそこをデータの終わりとする
って感じでやってます。
0289デフォルトの名無しさん
2007/09/29(土) 22:04:13Cの言語規約には含まれてはいないので、ご自由にどうぞ。
0290デフォルトの名無しさん
2007/09/29(土) 22:51:49いや、規約というかテクニックを教えていただけたらと思いまして。。。
0291デフォルトの名無しさん
2007/09/29(土) 22:56:33スレ違い。
0292デフォルトの名無しさん
2007/09/30(日) 00:16:290293デフォルトの名無しさん
2007/09/30(日) 00:17:49それがなんのことやら理解できないやつが>>292みたいな疑問を持つ。
0294デフォルトの名無しさん
2007/09/30(日) 00:20:45定石(じょうせき)
0295デフォルトの名無しさん
2007/09/30(日) 00:31:52どちらもよみはじょうせき。
馬鹿の癖に無理に揚げ足とろうとするな
0296デフォルトの名無しさん
2007/09/30(日) 01:19:030297デフォルトの名無しさん
2007/09/30(日) 08:03:430298デフォルトの名無しさん
2007/09/30(日) 12:20:31>>288の質問って結局
---------------------hoge
(ここがバイナリデータ部)
---------------------hoge--
ってフォーマットからデータ部を切り出すテクニック、ってことだよ。
これ追い返してたら何も質問できないだろw
ネットワークプログラミングに誘導しても、向こうの住人も困るんじゃないか。
通信関係なら兎も角、タダの文字列処理だもんな。。。
0299デフォルトの名無しさん
2007/09/30(日) 12:25:29ここは言語テクニックを語るスレでも初心者教習のスレでもありません。
標準Cでの仕様や実装を云々するスレです。
まして「データを切り出す際の定跡」と言った、言語に依存しない抽象概念を扱うスレではありません。
0300デフォルトの名無しさん
2007/09/30(日) 12:33:23標準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/
0301デフォルトの名無しさん
2007/09/30(日) 14:47:35C規格なら俺に聞け!
とか
0302デフォルトの名無しさん
2007/09/30(日) 14:55:20まあ、「規格」とか「標準」とかって言葉をいれておいた方がいいかもね。
0303デフォルトの名無しさん
2007/09/30(日) 14:59:120304デフォルトの名無しさん
2007/09/30(日) 15:00:570305デフォルトの名無しさん
2007/09/30(日) 15:13:30そもそも【】内を真面目に読む人少ないでしょ
>>1も読まれない、合致する質問もほとんど来ない
終了でいいんじゃね
0306デフォルトの名無しさん
2007/09/30(日) 15:14:16どう考えても字数制限引っかかるだろうが。あほか
0307デフォルトの名無しさん
2007/09/30(日) 15:18:49【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
上はコード質問可で、下は規約の解釈限定か。なかなか難しいなwww
0308デフォルトの名無しさん
2007/09/30(日) 15:20:03頭大丈夫?
0309デフォルトの名無しさん
2007/09/30(日) 15:20:51>>306の頭のことね
0310デフォルトの名無しさん
2007/09/30(日) 15:22:39でいいじゃん
0311デフォルトの名無しさん
2007/09/30(日) 15:29:56ISO/ANSI/JIS
これいらないだろ。
取っちゃえよ。
標準Cなら俺に聞け!
テンプレ:
Q標準Cって何?
0312デフォルトの名無しさん
2007/09/30(日) 15:32:31>>2の心得とかも必要ない。誤解されるだけ。
0313デフォルトの名無しさん
2007/09/30(日) 15:43:43そもそも定義にうるさいはずの連中がなんで「C言語」とか「標準C」とか「C」とか
いちいち呼び方変えてるんだよ。
アホか。
0314デフォルトの名無しさん
2007/09/30(日) 16:00:31>俺に聞け!
で
>質問お断り!
はねえだろw
0315デフォルトの名無しさん
2007/09/30(日) 16:05:12とあったら、普通はBが正タイトルでACはサブタイ。ACは繋げて読む事が多い。
AやCに重みがあるスレはネタスレと決まっています。
0316デフォルトの名無しさん
2007/09/30(日) 16:10:12意味だと思ってたんだけど、違ってたんだな。
「標準Cそのものに関する質問限定」ってことだったんだねw
0317デフォルトの名無しさん
2007/09/30(日) 16:13:35ここってネタスレだったんだ
納得ww
0318デフォルトの名無しさん
2007/09/30(日) 16:18:29フツーに考えて、規約の質問だけでpart132まで行くはずもなく……
いつの間に乗っ取られたんでしょうね。
0319デフォルトの名無しさん
2007/09/30(日) 16:19:28規約に全く関係ない質問なら、他に質問スレたくさんあるからそっちへ行ってくれればいい
0320デフォルトの名無しさん
2007/09/30(日) 16:20:440321デフォルトの名無しさん
2007/09/30(日) 16:28:23回りの皆様に迷惑をおかけしました、同乗していた方申し訳ありませんでした
0322デフォルトの名無しさん
2007/09/30(日) 16:30:36最後のマッサやばかったなw
あれは伝説に残る
0323デフォルトの名無しさん
2007/09/30(日) 16:40:040324デフォルトの名無しさん
2007/09/30(日) 16:53:01カキピー 3000ペリカ
オムツ 20000ペリカ
0325デフォルトの名無しさん
2007/10/01(月) 02:13:220326デフォルトの名無しさん
2007/10/01(月) 13:47:110327デフォルトの名無しさん
2007/10/01(月) 14:20:03非負の値だけの場合
「二つの型において同じ値の表現は同じとする」(6.2.5 型)
負の値も含まれる場合
6.2.6 型の表現 の 6.2.6.2 整数型、により、負の値の表現は
処理系定義となっているので、結果は処理系定義
だと思う
0328デフォルトの名無しさん
2007/10/01(月) 21:28:59正しくない値がポインタに代入されている場合,単項*演算子の動作は,未定義とする。
適合しない型のオブジェクトへのポインタが正しくない値と考えるなら未定義という
こともできないかな?
(83)の注釈にいくつか正しくない値の例があるがこれがすべてだとは言っていないようだ。
0329デフォルトの名無しさん
2007/10/09(火) 18:51:48作業時間48時間くらいで出来るC言語使った初歩レベルで作れるプログラムない?
都合よすぎかもしれないんだが、1年の節目としてなんか作れと先生に言われてるんだが
いい案がまったく出てこない、そういう例をまとめたサイトとかあれば最高なんだが。
0330デフォルトの名無しさん
2007/10/09(火) 18:53:34内容は時間内に作れれば何でもいいです。
0331デフォルトの名無しさん
2007/10/09(火) 18:55:470332デフォルトの名無しさん
2007/10/09(火) 18:57:58学生の1年目なら hit&blow
社会人の1年目なら 住所録(最大件数はメモリの許す限り無制限、10万件程度のデータに対して検索1秒以内)
くらいかな?
0333デフォルトの名無しさん
2007/10/09(火) 19:39:45>>331>>332 スレ違いに反応しない
0334デフォルトの名無しさん
2007/10/09(火) 20:52:49指定された名前の関数定義を探し当てるプログラムというのはどうかなッ
0335デフォルトの名無しさん
2007/10/09(火) 20:59:58申し訳ない。
>>331>>332
ありがとうございます。
0336デフォルトの名無しさん
2007/10/09(火) 22:54:240337デフォルトの名無しさん
2007/10/10(水) 00:13:550338デフォルトの名無しさん
2007/10/11(木) 14:26:34{
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つは実行確認用です。
0339デフォルトの名無しさん
2007/10/11(木) 14:33:04>a[2][i] = i;
範囲外
0340デフォルトの名無しさん
2007/10/11(木) 14:40:34レベルの質問は基本的にはこのスレの対象範囲外
0341デフォルトの名無しさん
2007/10/11(木) 20:52:460342デフォルトの名無しさん
2007/10/11(木) 20:53:420343デフォルトの名無しさん
2007/10/13(土) 13:27:48一時ファイルとして使ってるんですが、自前のデフラグで前に積めた時、
後ろのゴミを消したいので。
0344デフォルトの名無しさん
2007/10/13(土) 13:40:08限定的な話題扱うならスレタイ自重しろよボケが
0345デフォルトの名無しさん
2007/10/13(土) 13:54:090346デフォルトの名無しさん
2007/10/13(土) 13:55:400347デフォルトの名無しさん
2007/10/13(土) 14:19:140348デフォルトの名無しさん
2007/10/13(土) 14:24:040349デフォルトの名無しさん
2007/10/13(土) 14:26:15マルチすんな。あっちで回答しておいた。
0350デフォルトの名無しさん
2007/10/13(土) 14:26:48願ったり叶ったり。
0351デフォルトの名無しさん
2007/10/13(土) 14:54:40全角厨しか引っかからないな
愛用のかちゅ〜しゃで確認
0352デフォルトの名無しさん
2007/10/13(土) 15:10:16JaneDoeViewだと引っかかるから気がつかなかったよ
じゃぁこのスレも全角にすれば問題解決だな
0353デフォルトの名無しさん
2007/10/13(土) 17:14:580354デフォルトの名無しさん
2007/10/13(土) 19:43:13言葉使う側のオナニー
0355デフォルトの名無しさん
2007/10/13(土) 19:49:16毎回こんな事で揉めるのは双方不愉快になるし時間の無駄。
このスレの存在自体迷惑だし削除した方がマシだよ。
0356デフォルトの名無しさん
2007/10/13(土) 21:09:550357デフォルトの名無しさん
2007/10/13(土) 21:10:160358デフォルトの名無しさん
2007/10/13(土) 21:13:360359デフォルトの名無しさん
2007/10/14(日) 22:17:28>このスレの存在自体迷惑だし
どんな迷惑を被ったのかkwsk
0360デフォルトの名無しさん
2007/10/15(月) 00:44:030361デフォルトの名無しさん
2007/10/15(月) 23:21:44int x = v1 + v2;
これは推奨できないらしいですが、
どういう理由なんでしょうか
どうやらvolatile変数の参照は副作用を持つかららしいのですが、
具体的にどのようなケースがあるのでしょうか
0362デフォルトの名無しさん
2007/10/15(月) 23:25:55式 v1 + v2 の v1 と v2 のどちらが先に評価されるか不定だから。
0363デフォルトの名無しさん
2007/10/15(月) 23:37:50おっしゃる通り、評価順が不定なのはわかったのですが、
v = f() + g(); みたいなケースは
f()やg()内で副作用のある処理が行われたんだろうな〜
(グローバル変数をいじってるとか)
と想像はつくのですが
volatile変数の場合,
v1とv2が評価順に依存しているケースがあるって事なんでしょうか
その具体例が思い浮かばないです
0364デフォルトの名無しさん
2007/10/15(月) 23:40:03ググりましたが、volatile修飾子はコンパイル時の最適化を抑制する修飾子とのこと
たぶん、排他制御の二重ロックなどの冗長に見える部分の最適化を止めたいのでは?
DOSのシングルスレッドなプログラムしか組んだことないからよくわからないが…
http://itref.fc2web.com/c/index.html#volatile
0365364
2007/10/15(月) 23:41:50m(_ _)m
0366デフォルトの名無しさん
2007/10/15(月) 23:46:52#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;
}
何がおかしいですか?
0367デフォルトの名無しさん
2007/10/15(月) 23:47:42int data3[]=0;
0368デフォルトの名無しさん
2007/10/16(火) 00:13:38どうすればいいですか?
0369デフォルトの名無しさん
2007/10/16(火) 00:19:25未初期化の変数のロケーションを、必ず、読む、というコードが生成される、はず
規格では未初期化の自動変数を読んだ場合のふるまいはどうだっけ?
実際、どういう場合にまずいかというと
処理系(ここで言う処理系にはOS以下メモリやプロセッサまで含む)によっては
プロセスが、まだ書いたことのないロケーションを読もうとすると、メモリの
ゴミあさり(他のプロセスがパスワードとかを残してたりするの探す)と判断されて
例外で落とされるかもしれない、とか
0370361=363
2007/10/16(火) 00:22:31変数は初期済みという前提でおながいします
0371デフォルトの名無しさん
2007/10/16(火) 00:23:05int data3[N]={0};
他にもおかしいところがあるかもしれないけど見てない
0372デフォルトの名無しさん
2007/10/16(火) 00:26:17volatileオブジェクトは例えばプロセッサの内蔵タイマのようなリアルタイムに値の変化するものを指しているかもしれない。
0373デフォルトの名無しさん
2007/10/16(火) 00:27:16そこを直してもまだ1つエラーがありました。
data3[i + j] = data[i];
ここらしいです
0374デフォルトの名無しさん
2007/10/16(火) 00:27:36メモリマップド I/O だな。読んだだけでチップの信号が変わるとか。
0375デフォルトの名無しさん
2007/10/16(火) 00:28:33エラーメッセージ嫁。
読んで分からなかったらエラーメッセージ添えて聞け。
ここはエスパーごっこするスレじゃない。
0376363
2007/10/16(火) 00:29:41>>374
なるほど。ハードウェア絡みですね
確かに読むだけでデバイスの状態が変化する可能性がありますね
ありがとうございました!
0377デフォルトの名無しさん
2007/10/16(火) 00:31:43すみません。
エラー E2451 babble.cpp 10: 未定義のシンボル data(関数 main() )
だそうです。
0378デフォルトの名無しさん
2007/10/16(火) 00:34:28dataは1〜3だろ、無印は無い
たぶんdata3[i + j] = data1[i];
0379デフォルトの名無しさん
2007/10/16(火) 00:38:27なんでそこまで言われて気づかないんだ?
0380デフォルトの名無しさん
2007/10/16(火) 00:40:35っていうか悪いことは言わないから VC++ 2005 EE か Cygwin GCC にしとけ。
0381デフォルトの名無しさん
2007/10/16(火) 00:42:080382デフォルトの名無しさん
2007/10/16(火) 00:43:00すみません。ありがとうございました
0383デフォルトの名無しさん
2007/10/16(火) 00:58:14Cの配列は自動で領域拡張してくれないからdata3のメモリ領域は必ず確保することが必要だと。
data3[] = {0};
だとdata3の配列の長さは1です。今のままだと条件によってはバッファーオーバーランします。
0384デフォルトの名無しさん
2007/10/16(火) 01:10:34>>366なんか標準Cと何の関係もない、ただのデバッグ依頼だろ
ちゃんと切り分けろよ
0385デフォルトの名無しさん
2007/10/16(火) 01:10:34Nがわざわざ定義してあるだろ
0386デフォルトの名無しさん
2007/10/16(火) 01:20:08現状の結果は data3[] = {3,*,*,*,*};
となる。*部は未定義かつ異常アクセス。
このデータの場合読み込みしかしていないが
二つのif条件が共に満たされている場合始めの*に書き込み
Windouwsなら共有違反のエラーダイアログが出て強制終了されると思います。
0387デフォルトの名無しさん
2007/10/16(火) 01:24:340388デフォルトの名無しさん
2007/10/16(火) 01:27:280389384=386
2007/10/16(火) 21:29:100390デフォルトの名無しさん
2007/10/23(火) 23:39:290391デフォルトの名無しさん
2007/10/23(火) 23:56:210392デフォルトの名無しさん
2007/10/25(木) 02:01:37unsigned 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の補数の環境しかないので、確かめられません
0393デフォルトの名無しさん
2007/10/25(木) 02:06:39(unsigned int)-1 って書いてあるな…
0394デフォルトの名無しさん
2007/10/25(木) 02:16:57C の話は解決したとして、 C++ の reinterpret_cast の理解が間違ってる。
reinterpret_cast で int → unsigned int の変換はできない。
reinterpret_cast による変換結果はすべて実装依存。ビットパターン云々とは言えない。
0395デフォルトの名無しさん
2007/10/26(金) 12:00:55最適化では、値を読むことしかしてない変数は無駄なコードとして
削除されてしまう。
しかし、メモリマップドI/Oでは、I/Oのレジスタ類は変数として
定義され、その内容の変化のみをチェックする処理は多い。 その様な
変数には、volatile修飾子をつけないと最適化で消されてしまって
処理が実行されない。 Cソース上では存在するが、機械語コードでは
存在しなくなっている。 これを防止するのが主な使い方だな。
0396デフォルトの名無しさん
2007/10/26(金) 14:43:41それで思い出したがCPU自体にアトミックな操作ができない物があり、
そういうCPUではvolatileを完全に実現出来ないと聞いた。
具体的には16ビットCPUで32ビット変数を扱うと完全なvolatileには
ならない。16 + 16に分けて2回読み書きするためで、その間に割り込み
が入って内容を変更されてもCPUはそれに気づけない。
0397デフォルトの名無しさん
2007/10/26(金) 16:52:48>volatileを完全に実現出来ない
それは適当な表現じゃないなぁ。
単にvolatileではアトミックかどうかを意識できないだけの話だと思うんだ。
volatileがそれを保証する修飾子じゃないんだから実現できないってのとは違うでしょ。
0398デフォルトの名無しさん
2007/10/26(金) 17:12:01§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固有の
振る舞いを知っておく事は非常に重要なはずだ。
0399デフォルトの名無しさん
2007/10/26(金) 17:30:16> アトミックである事を保証できないのならvolatile修飾子の意味は
> 無い事になってしまう。
これは言い過ぎ。例えば
volatile x;
x = 2;
x = 3;
の x = 2; が実行されることが保証されること等、
アトミシティ以外にも存在する意味はある。
0400デフォルトの名無しさん
2007/10/26(金) 17:57:200401デフォルトの名無しさん
2007/10/26(金) 18:43:50保証されない。
xが32bitだとして16bitのCPUなら、上位16ビットを代入した直後に
割り込みが入って上位16ビットを書き換えたらもうダメ。
0402デフォルトの名無しさん
2007/10/26(金) 18:44:18○>>399
0403デフォルトの名無しさん
2007/10/26(金) 21:02:16>>401
>>399は別に、xに2が設定されることが保障されると
言ってはいないと思う。
0404デフォルトの名無しさん
2007/10/26(金) 21:30:30int X
X = 1+1;
dly_tsk(100); /* ウエイト */
if(X==2)
これはXは必ずしも真とはいえないのと同じか・・・?(割り込みで値なんていくらでも変更できるので)
volatileは最適化の抑止であって値の保証とは違うと思うが。
それともなんか俺、頭がおかしいのか?
最適化といえば、よくあるのがF-ROMのライトシーケンスやイレースシーケンスとかなんか同じアドレスに0xAAだの0x55だの書くから
最適化されるとうまく動かなくなるね。
ちなみに組み込みをやるとハードがらみで泣かされることがしばしば。
センサ情報で何度泣かされたか。ノイズで何度泣かされたか。静電気で・・・
0405デフォルトの名無しさん
2007/10/26(金) 21:31:10おきた時に何か問題おきるかな?
0406デフォルトの名無しさん
2007/10/26(金) 23:03:52(処理系の詳細ではなく仕様で定められたセマンティクスの範囲内でも)
実装可能になる並列データ構造とかは存在するんではなかろうか?
0407デフォルトの名無しさん
2007/10/26(金) 23:11:460408デフォルトの名無しさん
2007/10/26(金) 23:15:14allocaでずれたスタックポインタlongjmpで先祖がえりしてしまうような
ことは無いのか、どうなんでしょう?
0409デフォルトの名無しさん
2007/10/26(金) 23:15:590410デフォルトの名無しさん
2007/10/26(金) 23:24:37そんなあなたに sig_atomic_t
0411デフォルトの名無しさん
2007/10/26(金) 23:28:540412デフォルトの名無しさん
2007/10/26(金) 23:33:53int result;
result = setjmp();
if (!result) {
p = alloca(256);
hoge(); /* hoge calles longjmp, NO RETURN */
/* NOT REACHED HERE */
}
/* ここで p の指す先は大丈夫か? */
ということ?
0413デフォルトの名無しさん
2007/10/27(土) 00:21:05そうそんな感じです。C言語として保証されてるのかな?と
ふと思ったので。
0414デフォルトの名無しさん
2007/10/27(土) 00:39:460415デフォルトの名無しさん
2007/10/27(土) 00:40:120416デフォルトの名無しさん
2007/10/27(土) 00:45:120417デフォルトの名無しさん
2007/10/27(土) 01:48:57それがはC標準関数ではない
標準ではない型を別途定める必要があること自体C標準ではできないことの証明
0418デフォルトの名無しさん
2007/10/27(土) 02:26:560419デフォルトの名無しさん
2007/10/27(土) 02:45:540420デフォルトの名無しさん
2007/11/05(月) 22:32:442バイト文字の文字コードを持つint型の変数があるときに
この変数の文字コードに該当する文字を取得しようとしたのですが
char型にぶちこもうとしたら1バイトずつに分けられて格納されて、wcharを使っても分けられてしまうようなのですが
どうにか2バイトまとめて一つの文字コードだと判断させる方法はないでしょうか?
0421デフォルトの名無しさん
2007/11/05(月) 22:37:420422デフォルトの名無しさん
2007/11/05(月) 22:40:310423デフォルトの名無しさん
2007/11/05(月) 22:52:09フイタw
0424デフォルトの名無しさん
2007/11/05(月) 22:58:14何言ってるのか良く分からん。
>wcharを使っても分けられてしまうようなのですが
この部分を検証したコードと実行結果plz
0425デフォルトの名無しさん
2007/11/06(火) 00:29:42続く処理をして、それ以外は再度入力を促すプログラムを作ってます。
入力された値のエラーのチェックにはどんな処理が必要か
わからないので教えてください。
あと数値を入力してEnterを押して実行したあとに
前回入力した数値が残ったままになっているのを
消すにはどうすればいいですか?
0426425
2007/11/06(火) 00:32:34初心者いってきます
0427デフォルトの名無しさん
2007/11/11(日) 14:29:160428デフォルトの名無しさん
2007/11/11(日) 14:42:220429デフォルトの名無しさん
2007/11/11(日) 19:55:32構造体タグは独立した名前空間だから別にいいんじゃね?
C++に移植したときにはまらないとも限らんが。
0430デフォルトの名無しさん
2007/11/11(日) 20:09:227.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.
0431デフォルトの名無しさん
2007/11/15(木) 10:35:25俺が訳してやるぜ
アンダースコアから始まる識別子を使うな、どアホ
0432デフォルトの名無しさん
2007/11/15(木) 12:01:23> 加減演算子
>
> ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
> 配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
> よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
> とする。
これ見て思ったんだけど、たとえばメモリ空間がアドレス 0x0000-0xffff の環境で、
メモリ空間の終端 16 バイトに char a[16] が割り当てられて a が 0xfff0 を指す場合、
a + 16 は 0x0000 に対応することになると思うんだ。で、さらにその実装が 0x0000 を
ヌルポインタとしていた場合、 a + 16 == 0 が真になるようなことがあるかもしれない。
これはオーバーフローっぽいから配列をそんなところに割り当てないようにしないと
いけないのかもしれないけど、実際のところ a + 16 はオブジェクトを指す必要がないから
ヌルポインタになったところで問題ないのかもしれないとも思う。
配列の最後の要素を一つ越えたところを指しているポインタがヌルポインタと
等しくなるような実装って、規格の範囲内なのかね?
0433デフォルトの名無しさん
2007/11/15(木) 12:15:146.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 が成立しなきゃいけないらしい
0434デフォルトの名無しさん
2007/11/15(木) 12:29:14最強としておけば a < a + 16 の要件は満たせる。明示的なぬるぽとの比較は
未定義動作だから、これによって規格から外れるということにはならない・・・かなり苦しいな。
0435デフォルトの名無しさん
2007/11/15(木) 12:40:35アドレス空間の終端にあるようなときは、ちょっと気をつけて終端ぴったりにオブジェクトが
配置されないようにする必要がある、ってことになるのかな?
リンカに指示するマッピングで終端1ワード(バイト?)ぐらい予約にしてやればいいのか。
0436デフォルトの名無しさん
2007/11/15(木) 18:22:24>432のメモリモデルでユーザメモリ空間が0x8000以上なら、
ポインタ演算を符合付き整数で行なう実装ができそうだ。
0437デフォルトの名無しさん
2007/11/15(木) 21:26:340438デフォルトの名無しさん
2007/11/18(日) 00:07:49int main (void)
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d");
return 0;
}
printfの%dはいったいどうった仕様でよまれているんでしょうか?
0439デフォルトの名無しさん
2007/11/18(日) 00:15:320440デフォルトの名無しさん
2007/11/18(日) 00:19:39printfの%dは、何を表示したいか最後に引数で指定しないとだめ
printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d", a, b, 42);
0441デフォルトの名無しさん
2007/11/18(日) 01:10:04どうもです。
よくわからんかったんですけど、stdinのなかでも読んでるのかな?
いつもは書式("%d",a)見たいな感じで使ってるんですけど、
前問題で
scanf("%d",&a);
printf("あなたが入力したのは%dです");
があって、aの値が出力されたのでなんでだろうと思って聞いてみました。
0442デフォルトの名無しさん
2007/11/18(日) 01:39:09たぶんスタックが関係してるとおもうけど。
0443デフォルトの名無しさん
2007/11/18(日) 11:11:03違います。第2引数以降に順番に対応します。%d に限らずみんなそうです。
>>440 の例をよく吟味してみてください。
> 前問題で
> scanf("%d",&a);
> printf("あなたが入力したのは%dです");
> があって、aの値が出力されたのでなんでだろうと思って聞いてみました。
の答えが >>442 で、何かの問題としてそういうプログラムがあったのだったら、
それは誤植かバグ。
0444デフォルトの名無しさん
2007/11/20(火) 12:26:52どうすればいいでしょう?
例えば56を5と6に分けたい場合、どうすればいいのでしょう?
0445デフォルトの名無しさん
2007/11/20(火) 12:28:1256 % 10 → 6
0446デフォルトの名無しさん
2007/11/20(火) 12:36:560447デフォルトの名無しさん
2007/11/20(火) 12:37:440448デフォルトの名無しさん
2007/11/20(火) 12:48:280449デフォルトの名無しさん
2007/11/20(火) 15:42:08これがゆとり世代と言うもの
0450デフォルトの名無しさん
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 のような仮引数名は今でも安全なのでしょうか?
0451デフォルトの名無しさん
2007/11/23(金) 14:33:26処理系が _parameter というマクロを定義していた場合に
その引数の _parameter という部分が置き換えられるかもしれない、
という話じゃね。
C99 に対応してないだろう ANSI C/C++ 辞典を見ると、
下線で始まるマクロ名は全て予約識別子らしいから、
今でも問題があるかと。
下線を付ける場合は、普通後ろに1つだけ付ける。
0452デフォルトの名無しさん
2007/11/23(金) 15:06:34規格の範囲内で問題ないかといえば、問題ない。 >430 にあるように、タグ名を含む
ファイルスコープの識別子として予約されていて、マクロにも使える下線+英大文字とは
区別されている。
ただし、そういう指摘を受けて規格の詳細を見直さないと自信が持てないような
状況を避けるため、はじめから下線始まりの識別子を使わないようにしたほうがいい。
0453デフォルトの名無しさん
2007/11/27(火) 15:48:32あと、まったく未定義な関数つかっても他のソースにあるかもしれないからとかいう理由でコンパイルエラーだしてくれないじゃん。
とても不便だよね。
なんで、コンパイラはそれくらいのことをしてくれないのかな?別に面倒じゃないと思うんだけど。
0454デフォルトの名無しさん
2007/11/27(火) 15:57:06大抵のまともなコンパイラなら、(宣言が見つからないと言う理由で)警告を出してくれると思います。
尤も、中にはデフォルトではその警告を出さないコンパイラもありますが。
詳しいことは、それぞれのコンパイラのスレなどでどうぞ。
0455デフォルトの名無しさん
2007/11/27(火) 16:03:460456453
2007/11/27(火) 16:14:35やっぱ高いのじゃないとだめだね。なんでも。貧乏人は苦労するよ。
>>455 C言語のコンパイラ全部そうだとおもってたんだよ。俺はトウシロウだから。
0457デフォルトの名無しさん
2007/11/27(火) 16:24:38ここはコンパイラの使い方のスレではないので程々に。
今無料で利用できるコンパイラの多くが警告を出せると思うので、調べてみてください。
0458デフォルトの名無しさん
2007/11/27(火) 16:51:260459デフォルトの名無しさん
2007/11/27(火) 20:47:250460デフォルトの名無しさん
2007/11/28(水) 00:49:190461デフォルトの名無しさん
2007/11/28(水) 07:14:08Cの関数はデフォルトだと内部リンケージだったっけ?
0462デフォルトの名無しさん
2007/11/28(水) 10:45:040463デフォルトの名無しさん
2007/11/28(水) 20:12:34実装しなければならない数は 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 */
0464デフォルトの名無しさん
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>
と読み込ませるので、どちらが良いと思いますか?
あるいは、もっと良い方法がありますか?
0465デフォルトの名無しさん
2007/11/28(水) 20:16:38>>464 の訂正 /* ファイル名が逆 */
/* strcpy.cpp */
#define XCS_IS_CHAR
#include <template/strcpy.cpp>
/* wcscpy.cpp */
#define XCS_IS_WCHAR
#include <template/strcpy.cpp>
0466デフォルトの名無しさん
2007/11/28(水) 20:16:53template<typename T> T *xcscpy( T *dst_, const T *src_ ){
T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head;
};
0467デフォルトの名無しさん
2007/11/28(水) 20:21:52でもここは残念ながらCのスレ
0468デフォルトの名無しさん
2007/11/28(水) 20:50:080469デフォルトの名無しさん
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 ) ); }
のような変換も自動で出来ると嬉しいのですが。
0470デフォルトの名無しさん
2007/11/28(水) 20:59:13ファイルスコープにしてファイルを分ければ可能
0471デフォルトの名無しさん
2007/11/28(水) 21:03:42>同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが
できますよ、というか出来てます。#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
0472デフォルトの名無しさん
2007/11/28(水) 21:10:02それでいいならこれでもいいんじゃない?
#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;
}
0473デフォルトの名無しさん
2007/11/28(水) 21:15:40もちろんマクロ全開で使いまくりだが、中身を見なければ幸せだった気がする
0474デフォルトの名無しさん
2007/11/28(水) 21:20:23ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5351.zip
0475デフォルトの名無しさん
2007/11/29(木) 01:29:50これか?
http://sourceforge.jp/projects/cstl
0476デフォルトの名無しさん
2007/11/29(木) 06:41:15アドバイスください。。。
0477デフォルトの名無しさん
2007/11/29(木) 08:41:560478デフォルトの名無しさん
2007/11/29(木) 09:38:480479デフォルトの名無しさん
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
0480デフォルトの名無しさん
2007/11/29(木) 12:07:03小文字を変換しようとしてるのはどうして?
まあそれは置いといて、
for (k=0;k!='\0';k++){
ここでkを0に初期化してる(k=0)のに、0だったら抜ける(k!='\0')判定してるから
0481デフォルトの名無しさん
2007/11/29(木) 12:08:320482デフォルトの名無しさん
2007/11/29(木) 12:12:480483ニャン
2007/11/30(金) 18:15:48友達が検索エンジンに一括登録するソフトを作ったそうなんですが
ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?
それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません
それから乱数の関数の使い方教えて下さい
あと
画像の表示方も教えて下さい
0484デフォルトの名無しさん
2007/11/30(金) 18:18:080485ニャン
2007/11/30(金) 18:21:03ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?
それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません
それから乱数の関数の使い方教えて下さい
あと
画像の表示方も教えて下さい
0486デフォルトの名無しさん
2007/11/30(金) 18:24:22あと環境依存のやつはそれなりのスレで。
0487デフォルトの名無しさん
2007/11/30(金) 18:28:15> ネット上のボタンをクリックしたり コメント枠に書き込んだり
> するのはどうやってプログラムするのですか?
ブラウザがどういう仕組みで動いているのかを調べれば、どうやってプ
ログラムするかもわかるようになるよ。HTTP とか HTML とかね。
0488ニャン
2007/11/30(金) 18:28:18いろいろ困ってたんで
せめて1番上だけでも答えてください
お願いします
ところで 環境依存ってなんですか?
0489ニャン
2007/11/30(金) 18:30:400490ニャン
2007/11/30(金) 18:36:20もっと詳しく教えて下さい
0491ニャン
2007/11/30(金) 18:45:330492デフォルトの名無しさん
2007/11/30(金) 18:48:52読み終わったら >>1 を読め
一回休んで、もう一度 >>1 を読め
ついでに >>2 も読んでおけ
0493ニャン
2007/11/30(金) 18:49:230494デフォルトの名無しさん
2007/11/30(金) 19:36:430495デフォルトの名無しさん
2007/11/30(金) 20:01:150 #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を交換するという意味であってますか?
0496デフォルトの名無しさん
2007/11/30(金) 20:04:180497デフォルトの名無しさん
2007/11/30(金) 20:15:03次の患者さんどうぞ
0498デフォルトの名無しさん
2007/11/30(金) 22:40:30いいアイディアない?
あるヘッダファイルに以下のような定義がある。
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"},
...
};
だが、動的な初期化が出来ないってコンパイラにはじかれてしまう。
どうしたらいい?ボスケテ天才プログラマー。
0499デフォルトの名無しさん
2007/11/30(金) 22:47:26{&ID_HOGE_,"hoge"},
...
};
0500デフォルトの名無しさん
2007/11/30(金) 22:52:31いや、上にも書いたとおり、ID_HOGE_は公開されていなくて、
実体があるソースコードも書き換え不可なんですよ・・・。
0501デフォルトの名無しさん
2007/11/30(金) 23:23:44コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?
0502デフォルトの名無しさん
2007/11/30(金) 23:28:12http://www.amazon.co.jp/gp/product/4899771517/
Borland C++使ってる。
0503デフォルトの名無しさん
2007/11/30(金) 23:29:45やりたいこと、よくわかんねけどさ。
こうじゃあかんの?
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;
}
0504デフォルトの名無しさん
2007/11/30(金) 23:39:050505デフォルトの名無しさん
2007/11/30(金) 23:42:27ある座標系が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つの座標系において要素間の位置関係が等しくなっている全ての要素の
のなかで一番要素数が多いものを割り出す。プログラミングは
どのように組めばいいのでしょうか?よろしく願いします。
0506デフォルトの名無しさん
2007/11/30(金) 23:48:20>>1-2
>>505
>>1-2
0507デフォルトの名無しさん
2007/12/01(土) 01:34:09そのやりかたではできない。
どうせ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_;
これでいけるはず
0508デフォルトの名無しさん
2007/12/01(土) 02:04:09どこがMAPを隠蔽してるんですか?
0509デフォルトの名無しさん
2007/12/01(土) 03:12:18hogeの実体部分のソースは変更不可だってんだからそれは駄目だろ
静的な初期化はあきらめて、mainの頭で初期化するか
map要素を返す関数を用意してそれが最初に呼ばれたときに初期化するかしかないな
0510デフォルトの名無しさん
2007/12/01(土) 13:01:43ID 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);
0511デフォルトの名無しさん
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;
}
これでいいんじゃ?
0512デフォルトの名無しさん
2007/12/01(土) 16:10:51もうちょい正確にやりたいことを書かないと無理だと思うんだな。
何がしたいか正確には分からないけど多分 LCS とは別物だと思う。
>重複はない
座標系1の点 { (x10, y10), ... , (x19,y19) }
座標系2の点 { (x20, y20), ... , (x29,y29) }
で、どう重複がないのよ?i ≠ j なら x1i ≠ x1j って言ってるの?
>要素間の位置関係が等しくなっている全ての要素ののなかで一番要素数が多いもの
座標系1 に対して並行および回転移動を行った際、座標系1の点と座標系2の点とが一致する数が最大となる移動時での
一致する点の組みを選び出せばいいの?
0513デフォルトの名無しさん
2007/12/01(土) 17:47:560514デフォルトの名無しさん
2007/12/01(土) 22:41:50#define hoge
って書いてあるけど、インデントやスペースを挟んだ
# define hoge
みたいな書き方も規格的にOKですか?
0515デフォルトの名無しさん
2007/12/01(土) 22:42:090516デフォルトの名無しさん
2007/12/01(土) 23:16:530517デフォルトの名無しさん
2007/12/01(土) 23:54:57自信を持ってインデントします。
0518デフォルトの名無しさん
2007/12/02(日) 01:45:27ポインタのポインタをコンパイラ制限のために、さらにポインタに
するなど受け入れがたいため却下。
IDの比較はどうする?ポインタのポインタのポインタだから、
値を比較するには、ポインタのポインタn・・・とか、
ポインタのポインタが静的に定義されているから、
ポインタのポインタのアドレスで比較すればいいとか、
コピーするにはうんぬんとか。
ヤッテラレッカボケ!
0519デフォルトの名無しさん
2007/12/02(日) 01:52:34これだけのためにそうするのは少々無駄遣いという気もするけど。
0520デフォルトの名無しさん
2007/12/02(日) 03:07:50IDはポインタだからID *はポインタのポインタどまりだろうが
お前はまず教科書読み直せ
0521デフォルトの名無しさん
2007/12/02(日) 03:11:31アゲアシとってナニが楽しいのかね。そうやって
見下すことでオノレの存在価値を認識する作業を繰り返す
人生なんてオワリにしたほうがいいよ。
0522デフォルトの名無しさん
2007/12/02(日) 03:18:59こんなところで見下されてる人生なんてオワリにした方がいいよ
0523デフォルトの名無しさん
2007/12/02(日) 03:36:440524デフォルトの名無しさん
2007/12/02(日) 10:12:37その程度で受け入れ難いなら、まず「C言語を使う」という選択肢を捨てるべき。
C言語しか使えないならC言語の制限は受け入れるしか無いだろ。jk
0525デフォルトの名無しさん
2007/12/02(日) 10:34:24同意。言語の制限が枷になるなら言語選択からやり直すべき。
0526デフォルトの名無しさん
2007/12/02(日) 11:21:120527デフォルトの名無しさん
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 と書く必要があることになってしまいそうですけど、
ちょっと意味不明なコードになってしまいます。
0528デフォルトの名無しさん
2007/12/07(金) 12:38:320529デフォルトの名無しさん
2007/12/07(金) 21:00:23無理して規格の解釈ギリギリのコード書く必要もあるまい。
0530デフォルトの名無しさん
2007/12/08(土) 09:39:130531デフォルトの名無しさん
2007/12/08(土) 10:45:41予約マクロにも下線二文字か下線+英字と最低二文字を想定しているっぽいし、
下線一文字は処理系で特別に解釈されるようなことはないと思う。
普通に変数名としても使えるし。
0532デフォルトの名無しさん
2007/12/08(土) 11:51:47・二重下線を含む
・下線 _ で始まり英数文が続く
どちらのルールにも当てはまらない。
だから「予約識別子ではない」だろうね。
>予約識別子は __func__ だけじゃないかな。
>
>下線一文字は処理系で特別に解釈されるようなことはないと思う。
>普通に変数名としても使えるし。
たとえ予約識別子だろうと "普通に変数名として使える" よ。
"処理系で特別に解釈される" のではなく "処理系が既に使っている可能性がある" 名前。
0533デフォルトの名無しさん
2007/12/08(土) 12:06:58処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
処理系依存としか言えない。
0534デフォルトの名無しさん
2007/12/08(土) 12:52:31>>530
ファイルスコープは予約されてるっぽい。
>>531
マクロ名も識別子らしい。
自分から進んで規格見ないから勉強になるわぁ。
C89はシラネ。
どっかで見れないかね?
お取り寄せメンドイ。
0535デフォルトの名無しさん
2007/12/08(土) 13:17:21_ はC89の頃から大域名前空間では予約済み。
>処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
というか、処理系は予約識別子も予約されていない識別子も同様に扱う。
名前の上書きが問題になるのは識別子が予約されているかどうかとは別の問題。
例えば
char hoge[]="hoge";
…………
hoge[10] = '\0';
ってコードは言うまでもなく未定義で正しくないコードだが、
それでも "普通に書ける" コードではあろう。
0536デフォルトの名無しさん
2007/12/08(土) 13:19:43コンパイルが通るだけで普通なのかってことになるだろ
0537デフォルトの名無しさん
2007/12/08(土) 13:37:380538デフォルトの名無しさん
2007/12/08(土) 14:50:48規格と比べて云々しても答え出ないっしょ。
肯定も否定もでけまへん。
0539デフォルトの名無しさん
2007/12/08(土) 15:36:42コンパイルできるかどうかも処理系依存だということを忘れてる。
よって処理系に依存しない書き方が普通。
0540デフォルトの名無しさん
2007/12/08(土) 16:06:01C99のコードが普通のところもあれば
gcc依存のコードが普通なところもあれば
言えばキリが無いよ。
何が普通かなんて、語るだけナンセンス。
0541デフォルトの名無しさん
2007/12/08(土) 16:30:370542デフォルトの名無しさん
2007/12/08(土) 16:33:40とりあえず避けるわな、普通。
0543デフォルトの名無しさん
2007/12/08(土) 16:59:17・予約識別子は普通に変数名として使える。だが普通は使わない。
どっちも正しい。
二人とも普通の指してる先が違うんだ。
それに気づかなきゃ話が噛み合うわけがない。
0544デフォルトの名無しさん
2007/12/08(土) 17:01:060545デフォルトの名無しさん
2007/12/08(土) 17:41:55例え話に例え話で返すと話がズレがちなんで嫌なんだが、ちょっと言いたい。
>赤信号だろうが普通に渡ることはできる
規約違反。
精々「横断歩道の無い道を渡る」ぐらいのものだと思う。
車線無しならOK、対向1車線でもまぁ、対向2車線・・・うーん。
という感じで、程度問題ではなかろーか。
0546デフォルトの名無しさん
2007/12/08(土) 18:07:53そういう話じゃねえべ。
0547デフォルトの名無しさん
2007/12/08(土) 18:25:32何が普通かと同じで結論は出ません。
0548デフォルトの名無しさん
2007/12/08(土) 18:33:520549543
2007/12/08(土) 21:47:05ただし、そのようなコードをコンパイルする場合については undefined である。 <= 意味上の問題
だから、そういう書き方は "普通" はしない。 <= 道徳上の問題
「使えない」のか「使ってはいけない」のか「使わない」のかでは全く意味が違う。
だから話が噛み合っていない。
0550デフォルトの名無しさん
2007/12/08(土) 21:51:400551543
2007/12/08(土) 21:55:55ん、そっちの方が適当だね。
0552543
2007/12/08(土) 22:09:08俺的に分類してみた。
>>531 ?? (主語:プログラマが)
>>532 文法 (主語:処理系が)
>>533 意味 (主語:???)
>>535 文法 (主語:処理系が)
>>539 意味+作業 (主語:プログラマが)
>>540 文化 (主語:プログラマが)
>>542 作業 (主語:プログラマが)
>>548 意味 (主語:???)
0553デフォルトの名無しさん
2007/12/08(土) 22:42:44話が噛み合ってないとか以前に、自分の発言の意味を自分自身理解してるのか?
傍目にはお前が一番混乱してるぞ。 電波撒き散らすな。
0554デフォルトの名無しさん
2007/12/09(日) 03:07:37真っ当な指摘だと思うがね。
0555デフォルトの名無しさん
2007/12/09(日) 11:12:45>>549が混乱しているのか詳しく説明するか、逃げるかふたつにひとつになってしまいました
0556デフォルトの名無しさん
2007/12/17(月) 04:56:430557デフォルトの名無しさん
2007/12/17(月) 09:43:27calloc()を1引数にしたら存在意義がほとんどないじゃないか。
0558デフォルトの名無しさん
2007/12/17(月) 11:18:150559デフォルトの名無しさん
2007/12/17(月) 11:23:220560デフォルトの名無しさん
2007/12/17(月) 16:12:570561デフォルトの名無しさん
2007/12/17(月) 16:42:51なんで?
0562デフォルトの名無しさん
2007/12/18(火) 03:45:39int* p = (int*)malloc(100*200*sizeof(int));
...
typedef int A[100][200];
A* a = (A*)p;
のようなコードを書いたのですが、これだと使うときに(*a)[0][0]のように*が必要になってしまいます。
どうにか、*を使わずにa[0][0]のように書く方法はないでしょうか。
C++はNGです。
0563デフォルトの名無しさん
2007/12/18(火) 03:56:03int (*a)[200] = (int (*)[200])malloc(sizeof(int[200]) * 100);
typedef int A[200];
A* a = (A*)malloc(sizeof(A) * 100);
0564デフォルトの名無しさん
2007/12/18(火) 08:57:51これでいい
0565デフォルトの名無しさん
2007/12/19(水) 23:21:25それと、もし自分で実装するとしたらですが、KMPとBMのどちらが評判よいですか?
0566デフォルトの名無しさん
2007/12/19(水) 23:35:280567デフォルトの名無しさん
2007/12/19(水) 23:44:40あまりにも短い文字列などだとかえって時間かかるから。
0568デフォルトの名無しさん
2007/12/20(木) 02:59:481回しか使わない探索にテーブルのセットアップとかが無駄と言うのもあるけど
そもそも、そういうスキップする(全文字走査しない)アルゴリズムは
テキストの長さがあらかじめ判ってないと使えない。
そして、(strstrに渡す)文字列の長さをstrlenで調べてからBM法を使うくらいなら
長さを求める'\0'探しのついでに力任せ探索をするほうがずっとまし。
たとえ同じ文字列を何回も探索するような、初期化が必要ないケースでも。
0569デフォルトの名無しさん
2007/12/21(金) 00:21:03x=(~x)+1;とx=~(x-1);のどちらが適切でしょうか?
0570デフォルトの名無しさん
2007/12/21(金) 01:38:530571何を以って適切とするかが提示されていないから答えようがない罠
2007/12/21(金) 01:39:24x *= -1;
0572デフォルトの名無しさん
2007/12/21(金) 04:13:190573デフォルトの名無しさん
2007/12/21(金) 09:58:350574デフォルトの名無しさん
2007/12/21(金) 10:09:03>>570-571ではなかろうか
0575デフォルトの名無しさん
2007/12/21(金) 10:12:040576デフォルトの名無しさん
2007/12/21(金) 11:02:23xがunsignedならどっちも同じになるから、どっちでもいいよ。
0577デフォルトの名無しさん
2007/12/21(金) 11:52:010578デフォルトの名無しさん
2007/12/21(金) 11:56:240579デフォルトの名無しさん
2007/12/21(金) 13:00:08struct X {
...
char tag[1];
}
とか書いてあるものがありますが([0]の場合もあり)、これは何でしょうか?
0580デフォルトの名無しさん
2007/12/21(金) 13:08:33http://www.kouno.jp/home/c_faq/c2.html#6
0581デフォルトの名無しさん
2007/12/21(金) 13:11:490582デフォルトの名無しさん
2007/12/21(金) 13:13:08>>1にあるだろ。テンプレ嫁
0583デフォルトの名無しさん
2007/12/21(金) 13:15:32しかし、それが何であるかの説明にはなってないなw
しかしこのスレではスレ違いなので、
スレ立てるまでもない質問のほうに答えは書いておく。
0584デフォルトの名無しさん
2007/12/21(金) 13:57:03分散して見づらくなる。
0585デフォルトの名無しさん
2007/12/21(金) 14:23:06「わざとスレ違いな質問をする荒らしがいるのでそういうのは無視するか軽く流してください」
次からこう書かなきゃダメか?
0586デフォルトの名無しさん
2007/12/21(金) 14:34:520587デフォルトの名無しさん
2007/12/21(金) 14:42:27どの質問についての話なのかさっぱりわからない
>579についてのことなら、プログラム技法の質問であって規格の質問ではないからだ
0588デフォルトの名無しさん
2007/12/21(金) 14:43:510589デフォルトの名無しさん
2007/12/21(金) 14:43:54要素数が1のcharの配列です
としか答えられんよな
0590デフォルトの名無しさん
2007/12/21(金) 14:44:56規格に準拠したC言語に関するスレであって、規格のスレではなかったはずだが。
0591デフォルトの名無しさん
2007/12/21(金) 14:45:530592デフォルトの名無しさん
2007/12/21(金) 14:46:230593デフォルトの名無しさん
2007/12/21(金) 14:47:400594デフォルトの名無しさん
2007/12/21(金) 14:49:450595デフォルトの名無しさん
2007/12/21(金) 14:51:460596デフォルトの名無しさん
2007/12/21(金) 15:03:45何故?
0597デフォルトの名無しさん
2007/12/21(金) 15:05:58http://pc11.2ch.net/test/read.cgi/tech/1196509846/552
結局なぜ、こういう使いかたをするのかわからない
0598デフォルトの名無しさん
2007/12/21(金) 15:08:10向こうで聞け
0599デフォルトの名無しさん
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初版より抜粋
0600デフォルトの名無しさん
2007/12/21(金) 16:48:26struct name {
int namelen;
char *namestr;
};
にしないんだろう?二回malloc/freeするのがイヤってことなのかな。
0601デフォルトの名無しさん
2007/12/21(金) 16:58:540602デフォルトの名無しさん
2007/12/21(金) 17:05:11そのまま通信用バッファとかに使えるから、流行ってたんだと思う。
0603デフォルトの名無しさん
2007/12/21(金) 17:21:32CG法のプログラムを完成させ、以下の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法自体よくわかってないんですが…
0604デフォルトの名無しさん
2007/12/21(金) 17:22:170605デフォルトの名無しさん
2007/12/21(金) 17:26:040606デフォルトの名無しさん
2007/12/21(金) 17:35:030607デフォルトの名無しさん
2007/12/21(金) 17:38:06Lesson7 連立方程式-大規模疎行列(前処理つきICG法)
http://www.saitama-u.ac.jp/hiyama/suchi2.htm
0609デフォルトの名無しさん
2007/12/21(金) 17:45:59なつかしー。BCG法とかもやらされたなあ・・・
0610デフォルトの名無しさん
2007/12/21(金) 19:49:22シフト演算で、シフト量が0の場合の挙動は定義されているのかな?
それとも未定義?
int x;
x>>= 0:
x<<=0;
とかした場合
0611デフォルトの名無しさん
2007/12/21(金) 19:53:120612610
2007/12/21(金) 20:16:42どもです。
ANSI C ( JISX3010)
http://www.jisc.go.jp/
をぱらぱら読んでみましたが、
6.5.7 ビット単位のシフト演算子
を読む限り、負数の場合は未定義とはありますが、0に関しては
特に述べられてませんね。
どの処理系でも
(x >>= 0) == x
(x <<= 0) == x
と想定してFA?
0613デフォルトの名無しさん
2007/12/21(金) 20:22:21という式ではm-n=0という場合もある
0614デフォルトの名無しさん
2007/12/21(金) 23:50:39x >= 0 ならね。厳密に解釈するなら x < 0 なら << は未定義、>> は処理系定義。
0616デフォルトの名無しさん
2007/12/23(日) 23:54:53なぜこの技法はだめなんですか?
特に問題なさそうに思えるんですが
0617デフォルトの名無しさん
2007/12/23(日) 23:59:050618デフォルトの名無しさん
2007/12/24(月) 00:03:12http://www.kouno.jp/home/c_faq/c2.html#6
0619デフォルトの名無しさん
2007/12/24(月) 00:14:460620デフォルトの名無しさん
2007/12/24(月) 09:56:510621デフォルトの名無しさん
2007/12/24(月) 10:19:28ahosugi
0622デフォルトの名無しさん
2007/12/24(月) 10:21:23なんで何度も出てることを新しい情報のように紹介してくれるの?
0623デフォルトの名無しさん
2007/12/24(月) 10:32:470624デフォルトの名無しさん
2007/12/24(月) 10:47:430625デフォルトの名無しさん
2007/12/24(月) 10:53:530626デフォルトの名無しさん
2007/12/24(月) 10:55:470627デフォルトの名無しさん
2007/12/24(月) 10:56:34ttp://gcc.gnu.org/c99status.html
0628デフォルトの名無しさん
2007/12/24(月) 11:09:16こっちも完璧ではないけどね。
0629デフォルトの名無しさん
2007/12/24(月) 11:12:560630デフォルトの名無しさん
2007/12/24(月) 11:48:35昔との互換性?それとも技術的に改良部分が多いのか?難しいのか?
よくわからないけど
0631デフォルトの名無しさん
2007/12/24(月) 11:50:12当然じゃない?ビジネス的にはC++かC#を使ってってこと。
0632デフォルトの名無しさん
2007/12/24(月) 13:02:190633デフォルトの名無しさん
2007/12/24(月) 13:20:11620は、少なくともVC++ 7.1以上なら独自拡張扱いで使える。
http://msdn2.microsoft.com/en-us/library/34h23df8(VS.71).aspx
0634デフォルトの名無しさん
2007/12/24(月) 21:17:49読込みサイズを32*1024*1024にするとエラーがおきなくて、
読込みサイズをファイルサイズにするとエラーが起きるのはどうしてでしょうか
?
どなたかご教授下さいm(_願_)m
0635デフォルトの名無しさん
2007/12/24(月) 21:21:440636デフォルトの名無しさん
2007/12/24(月) 21:23:470637デフォルトの名無しさん
2007/12/24(月) 22:07:40スレ違いでした。失礼しました。
0638デフォルトの名無しさん
2007/12/25(火) 00:36:130639デフォルトの名無しさん
2007/12/25(火) 00:49:57なんでそう必死なんだ。
0640デフォルトの名無しさん
2007/12/25(火) 00:52:130641デフォルトの名無しさん
2007/12/25(火) 21:23:250642デフォルトの名無しさん
2007/12/25(火) 21:23:580643デフォルトの名無しさん
2007/12/25(火) 21:27:32http://pc11.2ch.net/test/read.cgi/tech/1188688416/
とかか?
0644デフォルトの名無しさん
2007/12/26(水) 11:27:290645デフォルトの名無しさん
2007/12/26(水) 12:12:570646デフォルトの名無しさん
2007/12/27(木) 09:54:110647デフォルトの名無しさん
2007/12/27(木) 17:49:56LEDで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が、更新されなくて消えない
0648デフォルトの名無しさん
2007/12/27(木) 17:52:070649デフォルトの名無しさん
2007/12/27(木) 18:08:32ここは標準Cについて語る・質問するスレなので他へどうぞ
0650デフォルトの名無しさん
2007/12/27(木) 18:09:35○手詰まり(てづまり)
0651デフォルトの名無しさん
2007/12/27(木) 18:35:440652デフォルトの名無しさん
2007/12/27(木) 18:38:57日本語の質問は鼬害です。
0653デフォルトの名無しさん
2007/12/27(木) 18:46:240654デフォルトの名無しさん
2007/12/27(木) 18:52:17>649
0655デフォルトの名無しさん
2007/12/27(木) 18:55:47ソースの断片だけ載せて何の説明もなしって馬鹿ですか?
初心者スレかエスパースレ、或いはゲ製板で改めて最初からどうぞ。
0656デフォルトの名無しさん
2007/12/27(木) 19:11:01#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; //ラケットからのボールの座標
0657デフォルトの名無しさん
2007/12/27(木) 19:11:25void 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);
}
0658デフォルトの名無しさん
2007/12/27(木) 19:11:47{
int i;
for (i = 0; i < 6/* ブロックの数*/; i++) {
block_bx[i] = (i % 3) * 4;
block_by[i] = 14 - (i / 3) * 4;
}
block_count = 6;
}
0659デフォルトの名無しさん
2007/12/27(木) 19:12:23{
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;
}
}
0660デフォルトの名無しさん
2007/12/27(木) 19:12:470661デフォルトの名無しさん
2007/12/27(木) 19:12:58} else {
if (key_shot == 1) { //push shot button
voll_x = rcket_x + 1;
voll_y = rcket_y;
key_shot = 0;
}
}
}
0662デフォルトの名無しさん
2007/12/27(木) 19:13:48日本語は読めますか?
Can you read Japanese?
0663デフォルトの名無しさん
2007/12/27(木) 19:18:20現在連投規制中? 何を指摘されているのかホントに判らんのかな。
0664デフォルトの名無しさん
2007/12/27(木) 19:21:150665デフォルトの名無しさん
2007/12/27(木) 19:34:00それが「常態」なら、赤点とっておけばいいと思うよ。
0666デフォルトの名無しさん
2007/12/27(木) 19:34:390667デフォルトの名無しさん
2007/12/27(木) 19:35:060668デフォルトの名無しさん
2007/12/27(木) 19:42:000669デフォルトの名無しさん
2007/12/27(木) 20:01:27led_dot()はC標準の関数ではありません
よってあなたのソースはこのスレの取り扱い範囲外です
0670デフォルトの名無しさん
2007/12/27(木) 21:22:03スレ違い
0671デフォルトの名無しさん
2007/12/28(金) 10:53:52>648
0672デフォルトの名無しさん
2007/12/28(金) 22:33:520673デフォルトの名無しさん
2007/12/29(土) 00:06:03のように記述すると'('がありません、といった警告が出る理由がわからないのですが、
正しい記述を教えて頂けませんか?
#pragma section (test, "rom") のような記述もあったと思うのですが違いが
さっぱりわからんのです
0674デフォルトの名無しさん
2007/12/29(土) 00:18:370675デフォルトの名無しさん
2007/12/29(土) 00:19:47pragmaの構文は実装依存です。従って、スレ違いですので該当スレでどうぞ。
0676デフォルトの名無しさん
2007/12/29(土) 01:17:55section じゃないけどな。
0677;
2007/12/30(日) 13:21:07コマンドライン引数を使いたいんですが
「新規作成.txt」をExeに放り込んだときにprintf()で確認したところ
C:\デスクトップ\新規作成.txtの部分を、新規作成.txtだけ抜き取りたい場合は
どうしたらいいんですか?
0678デフォルトの名無しさん
2007/12/30(日) 13:22:230679デフォルトの名無しさん
2007/12/30(日) 14:19:270680デフォルトの名無しさん
2007/12/30(日) 14:25:40\を後ろから調べて\の次
0681デフォルトの名無しさん
2007/12/30(日) 18:45:420682デフォルトの名無しさん
2007/12/30(日) 19:04:330683デフォルトの名無しさん
2007/12/30(日) 19:06:440684デフォルトの名無しさん
2007/12/30(日) 19:20:070685デフォルトの名無しさん
2007/12/30(日) 19:44:49テラカワイソス(´・ω・`)
0686デフォルトの名無しさん
2007/12/30(日) 19:45:37少なくとも、「テトリス」の知識がなければ作れないこと位いくらなんでも>681でも判っているだろうし。
0687デフォルトの名無しさん
2007/12/31(月) 01:48:370688デフォルトの名無しさん
2008/01/02(水) 18:17:07なんか変なこと言ったか?
http://www.kouno.jp/home/c_faq/c19.html#0
0689デフォルトの名無しさん
2008/01/02(水) 18:18:430690デフォルトの名無しさん
2008/01/02(水) 18:21:110691デフォルトの名無しさん
2008/01/02(水) 20:22:05エンター押せばいいんだし。
0692デフォルトの名無しさん
2008/01/02(水) 20:54:35明らかに聞くスレ間違ってるだろ
0693440
2008/01/02(水) 21:42:38テトリスはエスケープシーケンスの色を使って
emacsのテトリス風にすれば作れるかもしれませんね
落下するにはsleepとかで時間の間をあけたり使ったりするんすかね?
凄いテトリスって難しそうですが
0694デフォルトの名無しさん
2008/01/02(水) 21:44:30スレ間違えてないか?
0695デフォルトの名無しさん
2008/01/02(水) 21:46:22Cにsleepなんかないし、エスケープシーケンスなんかも定義されてない。
要するにあなたの質問は完全にスレ違いです。
0696デフォルトの名無しさん
2008/01/02(水) 22:09:130697デフォルトの名無しさん
2008/01/03(木) 22:17:07#define a b
#define b( x ) b( x, 0 )
で
a( a )
が
b( b, 0 )
にできることは定められていますか?
特に
・展開された字句が自分自身に一致することは安全か?
・大概のプリプロセッサが a と a() を別物として扱うのは規格化された動作か共通の拡張か?
・定数型マクロとして展開された字句が関数型マクロと一致した場合に再び置換されることが保証されているか?
について教えてください
0698デフォルトの名無しさん
2008/01/03(木) 22:34:55関数の引数に関数を渡すの?
0699デフォルトの名無しさん
2008/01/03(木) 22:57:01> (略)ANSI が新しく採
> 用したルールとして、あるマクロがひとたび展開された場合には、展開後
> のトークン列に同じマクロの呼び出しであると解釈できる部分があっても、
> もはやそのマクロは展開しないことになっているのです(略)
> (略)ANSI の規定では、この展
> 開抑制は、複数のマクロにまたがって有効でなければならないとされてい
> ます。
仕様書を持ってないのでこれ以上は誰かにパス
0700デフォルトの名無しさん
2008/01/03(木) 23:14:50> ・展開された字句が自分自身に一致することは安全か?
基本的には文字列置き換えなので
#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 の規格の方が読みやすい気もするが...
0701デフォルトの名無しさん
2008/01/04(金) 02:39:52規格は無料で読ませてほしいよな
0702デフォルトの名無しさん
2008/01/04(金) 08:26:091. UNIXのcronみたいに特定の時間になるとある処理を実行させる
2. そのプログラム自体はdaemonとしてずっと走り続けている
こういうことをLinux上でやりたいんですが、
sleepかalertを使って、
希望の時間になったかを調べ続けるしかないですかね。
何か普通はこうやるよってのあります?
1分に1回温度を測定するプログラムです。
0703デフォルトの名無しさん
2008/01/04(金) 09:33:49標準Cではできないので、unixプログラミングスレなどの該当スレへどうぞ。
0704702
2008/01/04(金) 10:48:21引っ越します。
【初心者歓迎】C/C++室 Ver.46【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1198755167/
0705デフォルトの名無しさん
2008/01/04(金) 22:52:43私の知る限りのコンパイラでは
#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
を読んでみても、それらしいことが書いてないような気がするので処理系定義か未規定かもしれません。
0706デフォルトの名無しさん
2008/01/05(土) 01:46:040707デフォルトの名無しさん
2008/01/05(土) 02:17:49規格によると、
* マクロaが定義されてるとき、マクロa()を再定義することは出来ない。その逆もできない。
* マクロaが定義されてるとき、識別子aは置換される。
* マクロa()が定義されてるとき、識別子aの後に(が現れる並びがあれば、対応する)まで置換される。
これらから、
* マクロaとマクロa()が同時に定義されていることはない。
* マクロaが定義されているとき、a()の並びは置換される。
* マクロa()が定義されているとき、(a)()の並びは置換されない。
が導出できると思う。
0708デフォルトの名無しさん
2008/01/05(土) 02:31:10おま、すごくやさしいな
0709デフォルトの名無しさん
2008/01/06(日) 00:43:58また、異なる2つのオブジェクトを指すポインタの比較結果について、同じオブジェクトの組に対しては常に &a < &b もしくは &a > &b の何れか一方のみが成り立つことが保証されていますか?
0710デフォルトの名無しさん
2008/01/06(日) 01:29:15後者はno。
aとbが同じオブジェクトであるとか、同じ配列オブジェクトの要素であるとか、
同じ構造体や共用体のメンバであるとかの場合を除いて、
オブジェクトのポインタの順序を比較した場合の動作は未定義。
0711デフォルトの名無しさん
2008/01/06(日) 01:51:16オブジェクトの一つ後ろの要素を参照してよいのは配列に対してのみ。
むかし実際に &a[NUM-1] がメモリの最後を指していて &a[NUM] が null になるケースにであったことがある。
0712デフォルトの名無しさん
2008/01/06(日) 02:09:18malloc(sizeof(T) * NUM), operator new(sizeof(T) * NUM) -> NG
T a[NUM], new T[NUM] -> OK
0713デフォルトの名無しさん
2008/01/06(日) 07:21:21大丈夫。&a[NUM]は中身を見ない限り保証されている。
>>711
それは、aの確保に問題がないか?
>>712
スレ違い。つーか、あんた馬鹿?
0714デフォルトの名無しさん
2008/01/06(日) 08:18:030715デフォルトの名無しさん
2008/01/06(日) 10:26:34これほどまでの馬鹿をかつてみたことがない
0716デフォルトの名無しさん
2008/01/06(日) 13:12:04>大丈夫。&a[NUM]は中身を見ない限り保証されている。
規格のどこに明記されてるの?
手元の禿本p125、128では配列についてしか述べられてないけど
0717デフォルトの名無しさん
2008/01/06(日) 14:25:350718デフォルトの名無しさん
2008/01/06(日) 14:28:01それだとchar型以外の型のポインタを取るのは不正な気がする。
0719デフォルトの名無しさん
2008/01/06(日) 14:37:02実際問題、&a == &bが偽なら&a < &bもしくは&a > &bが成り立つと仮定してよいのでは?
でも、確かに規格には全順序でなければならないなんて規定はないんだよね……。
0720デフォルトの名無しさん
2008/01/06(日) 14:49:34スレタイ音読しる。
0721デフォルトの名無しさん
2008/01/06(日) 14:51:160722デフォルトの名無しさん
2008/01/06(日) 15:30:02ソースきぼん
0723デフォルトの名無しさん
2008/01/06(日) 18:07:05できるけど後ろを指すポインタの方が整数値が大きくなるという保証はどこにもない
0724デフォルトの名無しさん
2008/01/06(日) 18:08:00規格に「配列オブジェクト」と書かれているのをスルーした713の脳内
0725デフォルトの名無しさん
2008/01/06(日) 18:23:460726デフォルトの名無しさん
2008/01/06(日) 18:24:170727デフォルトの名無しさん
2008/01/06(日) 18:54:50みたいなループを書きたいときだってあるだろう
0728デフォルトの名無しさん
2008/01/06(日) 20:16:19それは別にかまわないんじゃない?
>同じオブジェクトの組に対しては常に &a < &b もしくは &a > &b の何れか一方のみが成り立つ
としかか書かれてないんだから、比較するたびに &a < &b が &a > &b になったりしなければ。
極端な話、&a < &b < &c < &a なんて関係になっていても質問の条件は満たしてる。
0729デフォルトの名無しさん
2008/01/06(日) 20:18:360730デフォルトの名無しさん
2008/01/06(日) 20:22:51「同じオブジェクトを指すポインタは、整数としてみた場合常に同じ値になる」
ということは保証されてない気がする。
さすがに変更してないのに比較するたびに変わったりはしないだろうけど
0731デフォルトの名無しさん
2008/01/06(日) 20:57:47&a < &b < &c < &a は (&a < &b), (&b < &c), (&c < &a) が同時に成り立つって意味ね。
メモリモデルがフラットじゃなければアドレスは比較の度にオフセットやら何やらの組み合わせから何らかの仮想的な値にマップされて比較される。
だから (&a < &b) の時の &a と (&c < &a) の時の &a は内部的には違う値として表現されることがある。
0732デフォルトの名無しさん
2008/01/06(日) 21:00:16>>713の言うように保証されてるの?
0733デフォルトの名無しさん
2008/01/06(日) 21:01:48で、ポインタは必ず(なんらかの)整数型に変換でき、情報を保ったまま戻すことが出来る、
つまり (T *)(intptr_t)&a == (T *)(intptr_t)&a でしょ。
それでも、 (intptr_t)&a == (intptr_t)&a は保証されないのかな。
0734デフォルトの名無しさん
2008/01/06(日) 21:02:23中途半端に省略するのはイクナイ
0735デフォルトの名無しさん
2008/01/06(日) 21:02:580736デフォルトの名無しさん
2008/01/06(日) 21:08:50見てて、ふと16bit時代を思い出したよ。
farだと正規化されてないから違うとか、
hugeだと常に正規化されるから
大丈夫だけど遅いとか。
0737デフォルトの名無しさん
2008/01/06(日) 21:33:26記憶違いだったらごめん。
0738デフォルトの名無しさん
2008/01/06(日) 21:57:03正規化してた記憶がある。MSCのHUGEは知らない。
0739デフォルトの名無しさん
2008/01/06(日) 22:46:12MS 補正せず = サイズの境界が64Kになる制限、比較時に微妙 セグメント最小限
0740デフォルトの名無しさん
2008/01/07(月) 03:34:07同じオブジェクトを指すポインタだからといって同じ変数に格納されているとは限らない
具体例を言っちゃうと、farポインタは同じアドレスを指していても4096通りの表現が
あるわけだが。
0741デフォルトの名無しさん
2008/01/07(月) 04:07:16小学校に入りなおして、「こくご」の読解力を養ってはいかがですか?
0742デフォルトの名無しさん
2008/01/07(月) 05:13:25そしてそのデータが書き込まれたセクタ?(アドレス?)を取得する方法ってありますか?
0743デフォルトの名無しさん
2008/01/07(月) 05:27:520745デフォルトの名無しさん
2008/01/07(月) 06:02:45環境依存OKのとこだとここかな
http://pc11.2ch.net/test/read.cgi/tech/1198755167/l50
0746デフォルトの名無しさん
2008/01/07(月) 06:03:05GUIなどの標準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/
0748デフォルトの名無しさん
2008/01/08(火) 02:39:54malloc で配列を確保したんだから、配列についての記述に基づいて問題ないでしょ。
0749748
2008/01/08(火) 02:41:370750デフォルトの名無しさん
2008/01/08(火) 02:42:000751デフォルトの名無しさん
2008/01/08(火) 02:49:09確保するだけのmallocで保証されてるとは思えない
0752デフォルトの名無しさん
2008/01/08(火) 02:52:16int* a = malloc(sizeof(int));
*a の振舞いが規格中の int についての記述に従うと言っても信じないの?
0753デフォルトの名無しさん
2008/01/08(火) 02:52:16適当な推測で語らないでください^^
0754デフォルトの名無しさん
2008/01/08(火) 02:53:50信じません。
0755デフォルトの名無しさん
2008/01/08(火) 02:57:56そんな話してないでしょ?
malloc(size)で確保したものが配列かどうかってのが焦点
詳しい人とか規格持ってる人誰か検索して見つけてくれないかな
0756デフォルトの名無しさん
2008/01/08(火) 03:08:19「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] を指してると言っても問題ないだろうね。
そうなると複数要素の配列のときだけダメなんてルールになってるわけないと思う。
0757デフォルトの名無しさん
2008/01/08(火) 03:15:03それ自体、配列オブジェクトでないならば、比較が定義されない。
0758デフォルトの名無しさん
2008/01/08(火) 03:20:49あった。
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).
確保が成功したときに返されたポインタはどんな型のポインタにも代入でき、その場合
確保された領域にあるそのオブジェクトまたはオブジェクトの配列に(明示的に解放される
までの間)アクセスするのに使用できるよう、適切にアラインされている。
0759デフォルトの名無しさん
2008/01/08(火) 03:23:55実は比較演算子についての 6.5.8 Relational operators にも >756 に挙げたのと
同じ文面が載ってるんだぜ。
0760デフォルトの名無しさん
2008/01/08(火) 03:28:28配列の要素を指すポインタとでわざわざ振る舞いが違うわけねーだろって話だよ。常考。
ポインタと要素数だけ受け取る関数の身にもなってみろ。
0761デフォルトの名無しさん
2008/01/08(火) 03:49:03アラインの話じゃねぇぇえーー
0762デフォルトの名無しさん
2008/01/08(火) 03:52:24「オブジェクトの配列にアクセスするのに使用できる」って書いてあるのじゃ不満なのか?
これで不満ならもうお前が何の話をしてるのかわからんから教えてください。
0763758
2008/01/08(火) 04:06:14> The lifetime of an allocated object extends
> from the allocation until the deallocation.
0764デフォルトの名無しさん
2008/01/08(火) 05:33:02のであって、「配列でないオブジェクトも配列である」ではないな。
ポインタ≠アドレス。
0765デフォルトの名無しさん
2008/01/08(火) 05:53:56> ポインタと要素数だけ受け取る関数の身にもなってみろ。
規格の話ではないが、MSのライブラリ作成者の一人 Steve Maguire は自著 "Writing Solid Code" の中で
「for( p = pch; p < pch + size; ++p ) というコードは名前付き配列に対してしか動作しないのでライブラリの中では使用できない」
としているな。
きちんとした関数作成者なら、そこらへんは意識してコードを書いているだろう。
もちろん、ポインタと要素数だけ受け取って「ポインタが名前付き配列を指している」と勝手に仮定してコードを書いている人間の方が多いだろうが。
0766デフォルトの名無しさん
2008/01/08(火) 06:20:13なんかリンカーンの言葉みたいだ。
0767デフォルトの名無しさん
2008/01/08(火) 09:33:39うまく動かない名無しの配列(って何?)が想像できないのだけど...
0768デフォルトの名無しさん
2008/01/08(火) 11:49:30それがどうした?問題は振舞いが定義されているかどうかだろ?
0769デフォルトの名無しさん
2008/01/08(火) 12:07:420770デフォルトの名無しさん
2008/01/08(火) 13:28:30あくまで要素数1の配列なんだから保証されているとしてもそれはa+1までだろ
0771デフォルトの名無しさん
2008/01/08(火) 13:35:38もしpch+sizeがオーバーフローして0になってしまったらp<pch+sizeは真になることがない
0772デフォルトの名無しさん
2008/01/08(火) 13:42:50もしそうならわざわざ
>配列要素でないオブジェクトへのポインタは、要素数1の配列要素を指すポインタと同様に振舞う
なんて限定的に書くわけないだろう
動的に確保したメモリは配列と同様に扱われる、で済む
0773デフォルトの名無しさん
2008/01/08(火) 14:22:15その記述は int a に対する &a の振舞いも含めて定義するためのもの。
「動的に確保した〜」では不十分だよ。
758 の引用した箇所で malloc で配列を確保できると言えそうだから、もう
その記述はあんまり関係ないと思う。
0774デフォルトの名無しさん
2008/01/08(火) 14:39:06でも漏れも気になるし大事なことだから頑張って解明してくれエロイ人
0775デフォルトの名無しさん
2008/01/08(火) 14:40:43どーでもいい
0776デフォルトの名無しさん
2008/01/08(火) 14:46:48char *pch = malloc( size ) された動的配列(名無しの配列)に対しては上手く動かない。
0777デフォルトの名無しさん
2008/01/08(火) 14:47:360778デフォルトの名無しさん
2008/01/08(火) 14:49:15規格で保証されているか、されてないか
0779デフォルトの名無しさん
2008/01/08(火) 14:50:56配列の振舞いについて名無しかどうか、動的に確保されたものかどうかという区別が
規格にあるの?
0780デフォルトの名無しさん
2008/01/08(火) 15:08:59オブジェクトの配列に対するポインタとして扱う(代入する)ことができなければならない
という風に読めるから、mallocした領域であってもpch+sizeがオーバフローしないことは
保証されてるんじゃないかな
0781デフォルトの名無しさん
2008/01/08(火) 15:09:070782デフォルトの名無しさん
2008/01/08(火) 15:17:54それを特定のオブジェクトへのポインタに代入したときには、そのように扱うことができなければならないとされている
よってどんなオブジェクトへのポインタに対しても、少なくとも確保した領域の大きさが許す範囲において、
pch+size はオーバーフローしないことが保証されていなければならない
こうか?
0783デフォルトの名無しさん
2008/01/08(火) 15:19:510784デフォルトの名無しさん
2008/01/08(火) 15:28:41「ポインタは指している先が配列オブジェクトの要素でなくても配列オブジェクトを指している場合と同様に振る舞う」ってことは、全てのオブジェクトはポインタ演算中は配列として扱えることになる。
だとしたら、「配列オブジェクトの最後の要素の1つ次のアドレスを求めることが出来る」と配列オブジェクトと限定する意味がない気がする。
0785デフォルトの名無しさん
2008/01/08(火) 15:31:530786デフォルトの名無しさん
2008/01/08(火) 15:33:09VC, MS-C は昔からそういうことがあるってのは知られている。
>>711, >>432-436 で指摘されているのも多分MSのコンパイラだろう。
0787デフォルトの名無しさん
2008/01/08(火) 15:34:410788デフォルトの名無しさん
2008/01/08(火) 15:59:570789デフォルトの名無しさん
2008/01/08(火) 16:10:310790デフォルトの名無しさん
2008/01/08(火) 16:18:13直訳すると
確保した領域内にあるオブジェクトないしオブジェクトの配列のようなものにアクセスするための
such(ようなもの)をどうとるかが難しいところだ
0791デフォルトの名無しさん
2008/01/08(火) 16:18:340792デフォルトの名無しさん
2008/01/08(火) 16:19:07確保した領域内にあるそういったオブジェクト、ないしそういったオブジェクトの配列にアクセスするための
だから配列であるとみなしていいんじゃね?
0793デフォルトの名無しさん
2008/01/08(火) 16:22:05MSは厳密には規格に準拠してないってことか
0794デフォルトの名無しさん
2008/01/08(火) 16:22:41「オブジェクトの配列」と「配列オブジェクト」は同じものなのか?
0795デフォルトの名無しさん
2008/01/08(火) 16:28:22俺の記憶が正しければ、任意の妥当なポインタに対して+1が定義されるように
C99で変更されたんだったような気がする。ANSI Cの仕様書ないからわからんけど。
0796デフォルトの名無しさん
2008/01/08(火) 16:38:43> 「for( p = pch; p < pch + size; ++p ) というコードは名前付き配列に対してしか動作しないのでライブラリの中では使用できない」
なぜこれが、動的に確保した領域だと動作しないのでしょう?
0797デフォルトの名無しさん
2008/01/08(火) 17:20:08動的に確保した領域だと必ず動作しない という意味ではないよ。
動作しない場合が稀にあり得るという意味。
(今時のPC環境で実際に動かない場合を作るのはかなり無理)
理由は、mallocは一個が何バイトなのかわからないから。
普通の配列は一個のバイト数がわかるから、一個分以上の余裕がある場所なのかどうかわかる。
0798デフォルトの名無しさん
2008/01/08(火) 17:21:480799デフォルトの名無しさん
2008/01/08(火) 17:56:430800デフォルトの名無しさん
2008/01/08(火) 18:16:517.20.3 記憶域管理関数 calloc 関数、malloc 関数及び realloc 関数の
連続する呼び出しによって割り付けられる記憶域の順序及び隣接製は、
未規定とする。割り付けが成功したときに返されるポインタは、
いかなる型のオブジェクトへのポインタに代入しても良いように、
また(領域が明示的に解放されるまで)その割り付けられた領域の
オブジェクト又はオブジェクトの配列へのアクセスに使用しても
よいように、適切に境界調整されているものとする。
0801デフォルトの名無しさん
2008/01/08(火) 18:47:12>>711, >>432-436 を読め。
0802デフォルトの名無しさん
2008/01/08(火) 18:54:32C99より前:
char *p = malloc( size );
に対して p + size は保証されない。
C99以降:
int n;
int *p = &n;
に対しても p + 1 が可。
が回答だな。
0803デフォルトの名無しさん
2008/01/08(火) 19:03:15>理由は、mallocは一個が何バイトなのかわからないから。
それは違うぞ。
理由は、コンパイラ作成者が規格を "動的に確保された領域に対して p + size を保証する必要がない" と解釈したからだ。
やろうとすれば処理系は malloc() 時に、システムに1バイト余計(現実的には8バイトか?)に要求するだけで malloc() を p + size 安全にすることが出来たはず。
0804デフォルトの名無しさん
2008/01/08(火) 19:14:08>「for( p = pch; p < pch + size; ++p ) というコードは名前付き配列に対してしか動作しないのでライブラリの中では使用できない」
>なぜこれが、動的に確保した領域だと動作しないのでしょう?
例えばアドレス, メモリ空間が 32 bit の場合、
・プログラムがOSに 0x10 バイトの領域を要求する。
・OSがプログラムにアドレス 0xFFFFFFF0 - 0xFFFFFFFF の 0x10 バイトを割り当てる。
・pch + size は 0xFFFFFFF0 + 0x10 なのでオーバーフローする。
・ポインタ演算がオーバーフローした場合の動作は保証できない。
となる。
0805デフォルトの名無しさん
2008/01/08(火) 19:21:130806デフォルトの名無しさん
2008/01/08(火) 19:24:58で、mallocの実装に対してその要求は明記されてなかった(C99でされた?) と。
0807デフォルトの名無しさん
2008/01/08(火) 19:31:06たとえば16bit空間なら、malloc対象を0〜0xfffe( 65535byte)に
制限すればおk。
0808デフォルトの名無しさん
2008/01/08(火) 19:55:41もちっと細かく言えば
依然として malloc については何も言われていないが "char a[ num ]; の場合に限り" が "全てのオブジェクトについて" に拡張された影響で malloc も含まれるようになった、と。
0809デフォルトの名無しさん
2008/01/08(火) 20:41:290810デフォルトの名無しさん
2008/01/08(火) 21:27:35配列として確保したものの最後の次なら問題ないけど、
mallocで確保したものだとおかしいポインタかもしれない、と。
C99以前では。
0811デフォルトの名無しさん
2008/01/09(水) 00:06:53そういうこと。
0812デフォルトの名無しさん
2008/01/09(水) 01:01:330813デフォルトの名無しさん
2008/01/09(水) 01:09:55C99なら、終端を一つ飛び越えたところのポインタを得ることはできて、
割り付けられたオブジェクトの範囲を指すポインタと比較できる、
ということがこれまでの議論で大体明らかになった。
だが、ANSI Cだとどうなるかは、規格書が出てきてないからまだわからない。
0814デフォルトの名無しさん
2008/01/09(水) 01:22:16いけないっていう制約を満たせない malloc の実装に遭ったことがあるという人がいる
というだけの話。
要素数 NUM の配列 a に対して &a[NUM] は有効。
0815814
2008/01/09(水) 01:26:51気になったんでぐぐってみた。
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" が書かれた時代ということを考えれば不思議でもなんでもない。
0816デフォルトの名無しさん
2008/01/09(水) 02:11:220817デフォルトの名無しさん
2008/01/09(水) 02:16:21何言ってんだ?「オブジェクト」じゃ配列内要素(または "past the end" )を指す
ポインタ間の関係の説明にならないでしょ。
0818デフォルトの名無しさん
2008/01/09(水) 02:18:10規格として不完全ってこった。
0819デフォルトの名無しさん
2008/01/09(水) 02:22:12規格を読んだ上でその記述に基づいて「動的配列の終端はオーバーフローする
可能性がある」と主張した奴が一人でもいたか?
そうじゃなけりゃ解釈が分かれているとは言わないだろ。
0820デフォルトの名無しさん
2008/01/09(水) 02:46:41○ 配列オブジェクト以外には保証されていないと主張
0821デフォルトの名無しさん
2008/01/09(水) 02:49:410822デフォルトの名無しさん
2008/01/09(水) 02:50:420823デフォルトの名無しさん
2008/01/09(水) 03:01:40http://www.kouno.jp/home/c_faq/c2.html#6
と同じでグレーゾーンって気がする。
0824デフォルトの名無しさん
2008/01/09(水) 03:02:08C99ってANSIにはなってないのか?
C89って言った方が確実な希ガス
0825デフォルトの名無しさん
2008/01/09(水) 03:13:58struct x; を char *p=(char *)&x; のようにして sizeof(x) バイトの配列としてアクセスできることは保証されていますか?
0826デフォルトの名無しさん
2008/01/09(水) 03:25:51結論は
int* a = malloc(sizeof(int) * NUM) に対して a + NUM が配列の
"one past the last element" として使えないような実装は標準規格に
違反している。
ってことでいいか?
>>758 の引用を読んでまだこれを否定するやつなんていないだろ?
いるなら規格の記述に対する解釈を述べてくれ。
0827デフォルトの名無しさん
2008/01/09(水) 03:30:29されている
0828デフォルトの名無しさん
2008/01/09(水) 03:35:25問題ない。 6.5 Expressions の p7 でオブジェクトへのアクセスに使ってもいい型の
リストがあがっていて、そこにはオブジェクトの型に関わらず "a character type" が
含まれている。
0829デフォルトの名無しさん
2008/01/09(水) 03:40:32オブジェクトがただの記憶域だというのは規格中の用語の定義から明らかであり、
議論の余地はない。
3.14 より object の定義
> region of data storage in the execution environment, the contents of which can represent
> values
その FAQ にある例が規格に準拠していない理由は、構造体終端のパディングとか、
他の理由でしょ。
0830デフォルトの名無しさん
2008/01/09(水) 03:50:59「オブジェクトは単なる記憶域だから配列に言えることはオブジェクトに一般化して言える」と言えるのかってこと。
0831デフォルトの名無しさん
2008/01/09(水) 04:20:22具体的になんのこと?
「配列に言えること」っていっても、それが要素数や要素型に触れたことなら
単一オブジェクトに一般化できないのはあたりまえでしょ。
単一オブジェクトを指すポインタ p に対する p + 1 の話なら >756 で引用された
特記事項があるから適用できる。
0832831
2008/01/09(水) 04:26:59「オブジェクトは単なる記憶域だから配列に言えることはオブジェクトに一般化して言える」
なんて話は誰もしてないような。やっぱり 830 が何を問うているのかわからん。
0833デフォルトの名無しさん
2008/01/09(水) 07:35:27普通に考えたらarray objectはobjectをarrayで限定的に修飾してるんだから、
「配列の記憶域」みたいな感じだろ?
この配列が動的確保したものも含めるかどうかは
0834デフォルトの名無しさん
2008/01/09(水) 09:47:170835デフォルトの名無しさん
2008/01/09(水) 10:47:340836デフォルトの名無しさん
2008/01/09(水) 11:02:14「配列オブジェクト」が「動的確保した配列オブジェクト」を含むかどうかわからない
とか不思議なことを言っているようにしか見えない。
0837デフォルトの名無しさん
2008/01/09(水) 11:05:11>>758の引用を読んで、そのような結論に至る思考プロセスが理解できない。
0838デフォルトの名無しさん
2008/01/09(水) 11:08:08なら別の結論と、それにいたる規格の解釈を述べてくれ。
0839デフォルトの名無しさん
2008/01/09(水) 11:28:08>までの間)アクセスするのに使用できる
動的確保領域に配列としてアクセスできるのは分かるが、
配列オブジェクトと同等にみなすことはできないんじゃね?
array+sizeのポインタ演算は配列へのアクセスじゃないだろ
0840デフォルトの名無しさん
2008/01/09(水) 11:39:57「配列」と「配列オブジェクト」は違うってことか?斬新だな。
でもそんなこといったら "one past the last element" に限らず加算演算自体とか、
そのほかいろいろな記述が動的に確保した配列に適用できないんだけど、ほんとに
そう思うの?
まぁこの際だからいちおう調べてみるけどね。
0841840
2008/01/09(水) 12:21:41規格全体を見ると "array object" じゃない "array" は型についての説明で多く見られた。
でも >>756 の引用箇所のように、明らかにオブジェクトについての記述だとわかるところ
では "array object" の意味で "array" が使われているところもあった。
問題の箇所は「オブジェクトの配列」とあるから、これの意味するところは配列オブジェクト
と同等にみなすのが自然だし、そうしないと 840 で言ったように動的に確保した配列に
ついてほとんどのアクセスが認められなくなってしまうので「アクセスするのに使用できる」
とした記述と矛盾するので、これ以外の解釈はできないと言える。
0842840
2008/01/09(水) 12:39:38http://www.open-std.org/jtc1/sc22/wg14/
からダウンロードできるドラフト n1124.pdf 。今見直したらもっと新しいバージョンの
n1256.pdf がダウンロードできるみたいだね。
次スレからテンプレに入れといたほうがいいかも。
0843デフォルトの名無しさん
2008/01/09(水) 13:39:13何が面白いんだか。
0844デフォルトの名無しさん
2008/01/09(水) 14:38:57わかっていないのは本人だけで、みんなは内心馬鹿にしているのに。
0845デフォルトの名無しさん
2008/01/09(水) 18:37:310846デフォルトの名無しさん
2008/01/09(水) 19:02:140847デフォルトの名無しさん
2008/01/09(水) 21:15:42!!!
0848デフォルトの名無しさん
2008/01/09(水) 21:21:34保険を掛けているわけですね。
名無しの恥なんてかきすてなんだから何の意味があってそんなことする必要がある
のか全くわからんが。
0849デフォルトの名無しさん
2008/01/09(水) 23:02:490850デフォルトの名無しさん
2008/01/15(火) 20:27:40仮に
char ar[10];
として、4番目の要素へのポインタを引数で渡すようなとき
&ar[3]
と書く人と
ar+3
と書く人がいるみたいですが、このスレ的には、
どういう違いがありますか?
0851デフォルトの名無しさん
2008/01/15(火) 20:28:100852デフォルトの名無しさん
2008/01/15(火) 20:29:14添え字が範囲内であれば完全に等価です
0853デフォルトの名無しさん
2008/01/15(火) 22:43:21特に指定がなければ、
個人的に分かりやすい方を書けばいいんじゃね。
0854850
2008/01/15(火) 23:49:47文脈を考えながら使い分けて見ます。
0855デフォルトの名無しさん
2008/01/16(水) 00:20:39ar+3 はなんか直感的じゃない。
0856デフォルトの名無しさん
2008/01/16(水) 00:31:06計算の途中なんかだとは(ar+3)って書いたりするけど
0857デフォルトの名無しさん
2008/01/16(水) 00:36:04配列として渡すような場合はどっちでもいい感じ。
0858デフォルトの名無しさん
2008/01/16(水) 00:42:290859デフォルトの名無しさん
2008/01/16(水) 06:01:49そもそもar[3]は*(ar+3)のシンタックスシュガーなんだから、
無意味な二度手間だと思うし。
0860デフォルトの名無しさん
2008/01/16(水) 07:18:010861デフォルトの名無しさん
2008/01/16(水) 07:30:22伝える努力を放棄するくらいならアセンブラでも使えば?
0862デフォルトの名無しさん
2008/01/16(水) 07:34:32ar+3だと理解できないヤツとかいんの?
0863デフォルトの名無しさん
2008/01/16(水) 07:37:11つーか、いい加減スレ違いだからスタイルスレにでも行けば?
0864デフォルトの名無しさん
2008/01/16(水) 07:38:47汚いソースを平気で書いても何が悪いのか分からないようなやつ。
0865デフォルトの名無しさん
2008/01/16(水) 09:51:560866デフォルトの名無しさん
2008/01/16(水) 10:12:350867デフォルトの名無しさん
2008/01/16(水) 13:10:21範囲を狭めた配列という意味で渡す場合はar+3
0868デフォルトの名無しさん
2008/01/16(水) 13:18:420869デフォルトの名無しさん
2008/01/16(水) 13:20:5610万行くらいコード書けば考えも変わるだろう
0870デフォルトの名無しさん
2008/01/16(水) 16:00:10static修飾師を付けると異なるスレッドからアクセスした時に変数の値が書き換えられてしまいます。
各スレッド用に、個別に変数の値を保持する方法ってないですか。
0871デフォルトの名無しさん
2008/01/16(水) 16:13:540872デフォルトの名無しさん
2008/01/16(水) 16:33:450873デフォルトの名無しさん
2008/01/16(水) 16:34:540874デフォルトの名無しさん
2008/01/16(水) 17:07:480875デフォルトの名無しさん
2008/01/16(水) 17:36:410876デフォルトの名無しさん
2008/01/16(水) 18:00:330877デフォルトの名無しさん
2008/01/16(水) 20:14:20このスレのC++版みたいなスレってある?
C++の厳格な規格のみを扱うスレ。
0878デフォルトの名無しさん
2008/01/16(水) 20:22:34C++相談室 part60
http://pc11.2ch.net/test/read.cgi/tech/1200044614/
これは本来、規格限定の筈なんだが……
C++0x 2
http://pc11.2ch.net/test/read.cgi/tech/1191842951/
0879デフォルトの名無しさん
2008/01/16(水) 20:54:540880デフォルトの名無しさん
2008/01/16(水) 23:16:14POSIXもISOだかJISだかになってた気はするな
0881デフォルトの名無しさん
2008/01/16(水) 23:34:38各スレッドごとに固有の値が必要なら各スレッドごとに持て
具体的には関数内変数ではなく呼び出し元の変数に記録するようにしろ
0882デフォルトの名無しさん
2008/01/17(木) 07:31:350883デフォルトの名無しさん
2008/01/17(木) 10:13:160884デフォルトの名無しさん
2008/01/17(木) 11:13:07以下のようなエラーが出た。どのように解決したらいい?
/cygdrive/c/Temp/ccE0Li3g.o:report.c:(.text+0x62): undefined reference to `_Chan
ege'
collect2: ld returned 1 exit status
0885デフォルトの名無しさん
2008/01/17(木) 11:16:090886デフォルトの名無しさん
2008/01/17(木) 13:58:270887デフォルトの名無しさん
2008/01/17(木) 14:00:530888デフォルトの名無しさん
2008/01/17(木) 14:24:55まず英語を勉強してください
0889デフォルトの名無しさん
2008/01/17(木) 20:00:080890デフォルトの名無しさん
2008/01/17(木) 20:05:340891デフォルトの名無しさん
2008/01/17(木) 22:42:43PADを書いてからプログラムを書くという流れで勉強してます。
実際、PADなり、フローチャートなり書いてからcプログラミングはしたほうがいいのかな?
0892デフォルトの名無しさん
2008/01/17(木) 23:07:490893デフォルトの名無しさん
2008/01/17(木) 23:46:11ループ記号をサポートしているツールが少ない。知らない香具師も多い。
だからと言って、ループも分岐で書いたら話にならない。
・PAD
書くことに夢中になると本質を見失いかねない辺りはフローチャート以上。
ツールもなくはないが、読める人間が少ないのも事実。
ってことで、擬似コーディングをお勧め。
# つーか、スレ違いだがね。
0894デフォルトの名無しさん
2008/01/18(金) 01:13:21C#のmoveのような
0895デフォルトの名無しさん
2008/01/18(金) 01:16:240896デフォルトの名無しさん
2008/01/18(金) 06:31:02ありがとう。すれ違い内容ですいませんでした。
0897デフォルトの名無しさん
2008/01/18(金) 15:03:39マテ、それだとクリップボードに残らないじゃないか
0898デフォルトの名無しさん
2008/01/18(金) 15:14:01スレ違い
0899デフォルトの名無しさん
2008/01/18(金) 19:13:05そもそも、標準Cにコピー&ペーストと言う概念がない
0900デフォルトの名無しさん
2008/01/19(土) 00:09:13どういうスレタイがいいと思う?
ちょうど900だし
0901デフォルトの名無しさん
2008/01/19(土) 00:12:22は長くて無理だから
【標準】or【標準C】 C言語なら俺に聞け! Part 132 【限定】
とかか。
0902デフォルトの名無しさん
2008/01/19(土) 00:25:430903デフォルトの名無しさん
2008/01/19(土) 00:26:05でいいんじゃね
0904デフォルトの名無しさん
2008/01/19(土) 00:38:15別に ANSI だけでいいんじゃね?
他はコピーか訳だけなわけだし。
0905デフォルトの名無しさん
2008/01/19(土) 00:52:58環境依存の質問をするなという意図を明確に伝える必要があるな。
標準限定というのはもしかしたら歪曲的過ぎてよくわからない可能性があるw
0906デフォルトの名無しさん
2008/01/19(土) 00:58:350907デフォルトの名無しさん
2008/01/19(土) 00:59:040908デフォルトの名無しさん
2008/01/19(土) 00:59:44これでどうだ。
【規格厳密】標準Cなら俺に聞け! 132【環境非依存】
0909デフォルトの名無しさん
2008/01/19(土) 01:09:410910デフォルトの名無しさん
2008/01/19(土) 01:13:000911デフォルトの名無しさん
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
となる。
なんで?
0912デフォルトの名無しさん
2008/01/19(土) 09:44:590x8A43
'C'のASCIIコードが
0x43
0913デフォルトの名無しさん
2008/01/19(土) 09:53:320915デフォルトの名無しさん
2008/01/19(土) 10:10:51それの合計値、平均値を作るプログラムを課題で出されて
作ったんですが、うまくまわりません、どうしたらいいですか?
#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);
}
0916デフォルトの名無しさん
2008/01/19(土) 10:12:15int i;
double max, min;
for(i=0; i<N; i++) {
max += input[i];
}
min = max/(i);
*pmax = max;
*pmin = min;
}
0917デフォルトの名無しさん
2008/01/19(土) 10:15:470918デフォルトの名無しさん
2008/01/19(土) 10:18:52まあまあ
自力で途中までやったということで
丸投げスレとの差別化を図るという意味での存在意義はあるんだから
>>915
>>916のdouble max初期化してない
0919デフォルトの名無しさん
2008/01/19(土) 11:24:490920デフォルトの名無しさん
2008/01/19(土) 11:55:272ペインにしてテンプレ読みながらレスを書けるようにしないとな。
0921デフォルトの名無しさん
2008/01/19(土) 11:55:54平均ならmeanだ
0922デフォルトの名無しさん
2008/01/19(土) 12:02:280923デフォルトの名無しさん
2008/01/19(土) 12:23:02スレッド名は変わるのか?
0924デフォルトの名無しさん
2008/01/19(土) 12:40:100925デフォルトの名無しさん
2008/01/19(土) 12:43:02【規格】【議論】
0926デフォルトの名無しさん
2008/01/19(土) 22:06:570927デフォルトの名無しさん
2008/01/20(日) 08:21:170928デフォルトの名無しさん
2008/01/20(日) 08:40:25ありがとう
UNIXがcで書かれているときいたのですが
cでファイルの移動という概念がないならどんなカラクリでファイルを移動させてるんですかね
0929デフォルトの名無しさん
2008/01/20(日) 09:56:340930デフォルトの名無しさん
2008/01/20(日) 10:04:47あんたは辞書に載っていない単語は喋れないのか? そんなことはないだろ? つまりはそういうことだ。
0931デフォルトの名無しさん
2008/01/20(日) 10:05:540932デフォルトの名無しさん
2008/01/20(日) 11:17:18a = 501/500;
b = c / a;
これをfloatやdobleを使わずに1/1000まで計算したいんですけど
a = (501 * 1000)/500;
b= (c * 1000)/a;
で問題ないですよね?
0933デフォルトの名無しさん
2008/01/20(日) 15:42:490934デフォルトの名無しさん
2008/01/20(日) 15:46:530935デフォルトの名無しさん
2008/01/20(日) 15:49:10自分で電卓叩いてみるとよくわかるよ。
0936デフォルトの名無しさん
2008/01/20(日) 15:55:550937デフォルトの名無しさん
2008/01/20(日) 16:08:480938デフォルトの名無しさん
2008/01/20(日) 16:24:49>>932
ある
オーバーフローしないためにcに許される値の範囲が狭くなってしまう
素直に (500*c)/501 と書くか、あるいはもっと広い範囲を保証したいなら
500*(c/501)+(500*(c%501))/501などとする
0939デフォルトの名無しさん
2008/01/20(日) 16:25:000940デフォルトの名無しさん
2008/01/21(月) 01:00:26http://mori.eco.to/
0941デフォルトの名無しさん
2008/01/21(月) 12:59:28struct hoge_tag hoge = {};
で十分?
それとも
struct hoge_tag hoge = { 0 };
せめて一つは指定しないとダメ?
0942デフォルトの名無しさん
2008/01/21(月) 13:54:260943デフォルトの名無しさん
2008/01/21(月) 13:55:550944デフォルトの名無しさん
2008/01/21(月) 14:06:17{}の中には一つ以上の初期化子が必要
0945デフォルトの名無しさん
2008/01/21(月) 21:07:43どうすればできますか?
0946デフォルトの名無しさん
2008/01/21(月) 21:14:550947デフォルトの名無しさん
2008/01/21(月) 21:19:130948デフォルトの名無しさん
2008/01/21(月) 21:23:400949デフォルトの名無しさん
2008/01/21(月) 21:31:420950デフォルトの名無しさん
2008/01/21(月) 22:07:51#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;
}
0951デフォルトの名無しさん
2008/01/21(月) 22:09:47void 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 でおねがいします
0952デフォルトの名無しさん
2008/01/21(月) 22:16:340953デフォルトの名無しさん
2008/01/21(月) 22:16:41>>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/
0954デフォルトの名無しさん
2008/01/21(月) 22:35:150955デフォルトの名無しさん
2008/01/22(火) 00:51:10一般的にどういう風にするのでしょうか?
0956デフォルトの名無しさん
2008/01/22(火) 01:05:59先頭部だったらisspaceでポインタずらすだけで済む場合もあるし
ケツを削るときは末尾から判定して非空白の直後を'\0'にすりゃいいし
書き換えできないなら当然コピーするし
0957デフォルトの名無しさん
2008/01/22(火) 01:27:13直近では、手抜きの sscanf でいけそうです。
どうもありがとうございました。
0958955
2008/01/22(火) 01:37:52isspaceを使ってコピーするなら、これでOK?
void trim(char *to, char *from)
{
while (isspace(*from)) {
*from++;
}
while (!isspace(*from)) {
*to++ = *from++;
};
*to = '\0';
};
0959デフォルトの名無しさん
2008/01/22(火) 01:50:03void trim(char *to, char *from)
{
while (*from && isspace(*from)) {
*from++;
}
while (*from && !isspace(*from)) {
*to++ = *from++;
};
*to = '\0';
};
0960デフォルトの名無しさん
2008/01/22(火) 01:57:42{
while(isspace(*s)) s++;
for(char *p = s; *p && !isspace(*p); p++) ; *p = '\0';
return s;
}
0961デフォルトの名無しさん
2008/01/22(火) 02:00:480962デフォルトの名無しさん
2008/01/22(火) 02:32:26{
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;
}
0963デフォルトの名無しさん
2008/01/22(火) 02:47:210964デフォルトの名無しさん
2008/01/22(火) 11:29:100965デフォルトの名無しさん
2008/01/22(火) 13:00:01なぜでしょうか
理由を教えてください
0966デフォルトの名無しさん
2008/01/22(火) 13:02:21ググレカス
http://www.google.co.jp/search?q=ctypes+%22unsigned+char%22+cast
0967デフォルトの名無しさん
2008/01/22(火) 13:19:45ありがとうございました
ということは与えられる文字がASCIIの範囲ではないかもしれないとすれば
そもそもis〜だけでは正しく処理できない可能性があるということになりますね
0968デフォルトの名無しさん
2008/01/23(水) 23:42:46これから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の行です。
よろしくお願いします。
0969デフォルトの名無しさん
2008/01/24(木) 00:09:04スレ違い。初心者スレへでもどうぞ。
ちなみに、12行目はendが恐らくは整数型なので代入で警告が出て更に比較で警告が出ている。
13行目は、唐突に出てきた_aalineresのメンバstartやendが引き算できない型なのでエラーが出ている。
0970デフォルトの名無しさん
2008/01/24(木) 00:11:55aalineresは、コピー間違いでした。
0971デフォルトの名無しさん
2008/01/24(木) 00:46:120972デフォルトの名無しさん
2008/01/24(木) 00:59:210973デフォルトの名無しさん
2008/01/24(木) 07:53:25次スレ
C言語なら俺に聞け(入門篇) Part 24
http://pc11.2ch.net/test/read.cgi/tech/1201083176/
0974立てようとしたけど立てらんなかった
2008/01/24(木) 11:45:22このスレは標準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/
【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。
0975デフォルトの名無しさん
2008/01/24(木) 12:19:47あれじゃ勘違い質問がより増える
0976デフォルトの名無しさん
2008/01/24(木) 13:07:430977デフォルトの名無しさん
2008/01/24(木) 13:34:41>このスレは標準C規格に合致した移植性の高い記法・技法に関するスレです。
なことになったんだよ?
0978デフォルトの名無しさん
2008/01/24(木) 13:57:58char *char_name, *sprintf_name;
char_name = NAME;
sprintf( sprintf_name, "%s", NAME);
最下行の二つは同じ意味になるのでしょうか?
0979デフォルトの名無しさん
2008/01/24(木) 14:18:18p.70 のコード
x = (x & 0x55555555) + ((x >> 1) & 0x55555555); というコードで、
「(x & 0xAAAAAAAA) >> 1 ではなく、(x >> 1) & 0x55555555 としたのは、大きな定数二つがレジスタに置かれないようにするためである。」
とありますが、大きな定数がレジスタに置かれるとどんな問題が起こるのでしょうか?
実際、0xAAAAAAAA が 2 個レジスタに置かれた状態だと、どのレジスタにどんな値が入るのでしょうか?
また、レジスタの大きさにもよると思うのですが、レジスタに置かれるとまずいほど「大きな」定数の「大きな」を決める閾値は、どのくらいになりますか?
0980デフォルトの名無しさん
2008/01/24(木) 14:28:05もともとはなんだったの?
0981デフォルトの名無しさん
2008/01/24(木) 14:30:00片方はエラーになる。
つか、実行して確かめてみれば済むことだろう?
0982デフォルトの名無しさん
2008/01/24(木) 14:33:43あなたはまだC言語の仕様そのものをほとんど理解していないようです
初心者用のスレへどうぞ
0983デフォルトの名無しさん
2008/01/24(木) 14:55:03【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
0984デフォルトの名無しさん
2008/01/24(木) 14:55:35すみません。
両方ともエラーにはなっていません。
実行しても、期待通りの動作をしているので同じ意味なのか質問させて頂きました。
0985デフォルトの名無しさん
2008/01/24(木) 14:56:17違うし、たまたま動いてるだけのバグ入り
0986デフォルトの名無しさん
2008/01/24(木) 14:58:400987デフォルトの名無しさん
2008/01/24(木) 14:59:120988デフォルトの名無しさん
2008/01/24(木) 15:00:29俺は違うとは思わんから説明できん
0989984
2008/01/24(木) 15:03:13問題があるのなら、説明して頂けませんでしょうか?
0990デフォルトの名無しさん
2008/01/24(木) 15:03:41ややこしい大きな定数をレジスタにロードするのはRISC系CPUでは面倒いから、
2回もロードしたくないってことじゃない?コードが長くなるしCPUサイクルも食うし
同じ値にしとけば1回のロードで済む
それ以外にまずいことは別段起きないかと
0991デフォルトの名無しさん
2008/01/24(木) 15:06:33わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。
0992デフォルトの名無しさん
2008/01/24(木) 15:08:55同じ意味になりません。
char_name = NAME; は、NAME を指すように char_name を変更する。char_name が指している先は変更しない。
sprintf(略); は、sprintf_name が指している先に NAME をコピーする。sprintf_name 自体は変更しない。
0993デフォルトの名無しさん
2008/01/24(木) 15:09:530994デフォルトの名無しさん
2008/01/24(木) 15:13:240995デフォルトの名無しさん
2008/01/24(木) 15:14:49特定の環境だとよくあったりするのかね
0996デフォルトの名無しさん
2008/01/24(木) 15:18:010997デフォルトの名無しさん
2008/01/24(木) 15:18:06ってことで梅
0998デフォルトの名無しさん
2008/01/24(木) 15:19:080999デフォルトの名無しさん
2008/01/24(木) 15:19:421000デフォルトの名無しさん
2008/01/24(木) 15:20:3910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。