07/11/15 12:29:14
効率の面から全然現実的じゃないけど、大小比較においてはぬるぽを特別扱いして
最強としておけば a < a + 16 の要件は満たせる。明示的なぬるぽとの比較は
未定義動作だから、これによって規格から外れるということにはならない・・・かなり苦しいな。
435:デフォルトの名無しさん
07/11/15 12:40:35
ってことは、アドレス 0 をヌルポインタに使っている実装で、 ROM や RAM が
アドレス空間の終端にあるようなときは、ちょっと気をつけて終端ぴったりにオブジェクトが
配置されないようにする必要がある、ってことになるのかな?
リンカに指示するマッピングで終端1ワード(バイト?)ぐらい予約にしてやればいいのか。
436:デフォルトの名無しさん
07/11/15 18:22:24
>>434
>432のメモリモデルでユーザメモリ空間が0x8000以上なら、
ポインタ演算を符合付き整数で行なう実装ができそうだ。
437:デフォルトの名無しさん
07/11/15 21:26:34
いかれた規格野郎のために、これでまともに動作すれば規格合致で portable なことが保証できる、規格の限界を極めた変態処理系とかできないもんかな。
438:デフォルトの名無しさん
07/11/18 00:07:49
#include <stdio.h>
int main (void)
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d");
return 0;
}
printfの%dはいったいどうった仕様でよまれているんでしょうか?
439:デフォルトの名無しさん
07/11/18 00:15:32
URLリンク(www.linux.or.jp)
440:デフォルトの名無しさん
07/11/18 00:19:39
>>438
printfの%dは、何を表示したいか最後に引数で指定しないとだめ
printf("2番目の数みたい%d1番目の数みたい%dこれはどこ?%d", a, b, 42);
441:デフォルトの名無しさん
07/11/18 01:10:04
>>439>>440
どうもです。
よくわからんかったんですけど、stdinのなかでも読んでるのかな?
いつもは書式("%d",a)見たいな感じで使ってるんですけど、
前問題で
scanf("%d",&a);
printf("あなたが入力したのは%dです");
があって、aの値が出力されたのでなんでだろうと思って聞いてみました。
442:デフォルトの名無しさん
07/11/18 01:39:09
未定義動作なので、単なる偶然。
たぶんスタックが関係してるとおもうけど。
443:デフォルトの名無しさん
07/11/18 11:11:03
> よくわからんかったんですけど、stdinのなかでも読んでるのかな?
違います。第2引数以降に順番に対応します。%d に限らずみんなそうです。
>>440 の例をよく吟味してみてください。
> 前問題で
> scanf("%d",&a);
> printf("あなたが入力したのは%dです");
> があって、aの値が出力されたのでなんでだろうと思って聞いてみました。
の答えが >>442 で、何かの問題としてそういうプログラムがあったのだったら、
それは誤植かバグ。
444:デフォルトの名無しさん
07/11/20 12:26:52
10から99までの10進数の数値を1の桁と10の桁に分けたい場合
どうすればいいでしょう?
例えば56を5と6に分けたい場合、どうすればいいのでしょう?
445:デフォルトの名無しさん
07/11/20 12:28:12
56 / 10 → 5
56 % 10 → 6
446:デフォルトの名無しさん
07/11/20 12:36:56
long型なんですが・・・
447:デフォルトの名無しさん
07/11/20 12:37:44
あっ間違えました。ありがとうございました
448:デフォルトの名無しさん
07/11/20 12:48:28
↑のような質問のスレではないので次の質問を書く人は注意
449:デフォルトの名無しさん
07/11/20 15:42:08
>>448
これがゆとり世代と言うもの
450:デフォルトの名無しさん
07/11/23 14:20:32
予約識別子について質問です。
今までは
・下線 _ で始まり英小文字 a-z が続く一般識別子は global namespace で予約済み
というルールから、
type_t function( type_t _parameter ){ return _parameter; };
のような仮引数名は予約識別子ではなかったはず(FAQでも同様の回答)なのですが、
「C99 では Reserved identifiers が『マクロ名を含む』になったから global namespace で #define _paramete されてたら仮引数名も上書きされない?」
と指摘されました。
恥ずかしながら、規格を読んでみても具体的に何が変わったのか私には分かりませんでした。
「今後は避けられるなら避けた方がよい」のは前提として、
既にある _parameter のような仮引数名は今でも安全なのでしょうか?
451:デフォルトの名無しさん
07/11/23 14:33:26
処理系が _parameter というマクロを定義可能になったから、
処理系が _parameter というマクロを定義していた場合に
その引数の _parameter という部分が置き換えられるかもしれない、
という話じゃね。
C99 に対応してないだろう ANSI C/C++ 辞典を見ると、
下線で始まるマクロ名は全て予約識別子らしいから、
今でも問題があるかと。
下線を付ける場合は、普通後ろに1つだけ付ける。
452:デフォルトの名無しさん
07/11/23 15:06:34
>>450
規格の範囲内で問題ないかといえば、問題ない。 >430 にあるように、タグ名を含む
ファイルスコープの識別子として予約されていて、マクロにも使える下線+英大文字とは
区別されている。
ただし、そういう指摘を受けて規格の詳細を見直さないと自信が持てないような
状況を避けるため、はじめから下線始まりの識別子を使わないようにしたほうがいい。
453:デフォルトの名無しさん
07/11/27 15:48:32
C言語ってさ、他のソースに定義してある関数とか引数ちがってmainの中で使ってもコンパイルエラーださないじゃん。
あと、まったく未定義な関数つかっても他のソースにあるかもしれないからとかいう理由でコンパイルエラーだしてくれないじゃん。
とても不便だよね。
なんで、コンパイラはそれくらいのことをしてくれないのかな?別に面倒じゃないと思うんだけど。
454:デフォルトの名無しさん
07/11/27 15:57:06
>>453
大抵のまともなコンパイラなら、(宣言が見つからないと言う理由で)警告を出してくれると思います。
尤も、中にはデフォルトではその警告を出さないコンパイラもありますが。
詳しいことは、それぞれのコンパイラのスレなどでどうぞ。
455:デフォルトの名無しさん
07/11/27 16:03:46
>>453 のような話題のためのスレではないので次の質問を書く人は注意
456:453
07/11/27 16:14:35
>>454 thx 俺のコンパイラがいけんのか。そうか。
やっぱ高いのじゃないとだめだね。なんでも。貧乏人は苦労するよ。
>>455 C言語のコンパイラ全部そうだとおもってたんだよ。俺はトウシロウだから。
457:デフォルトの名無しさん
07/11/27 16:24:38
>>456
ここはコンパイラの使い方のスレではないので程々に。
今無料で利用できるコンパイラの多くが警告を出せると思うので、調べてみてください。
458:デフォルトの名無しさん
07/11/27 16:51:26
gccなら-Wall つけとけ
459:デフォルトの名無しさん
07/11/27 20:47:25
本当はリンカの仕事だからな
460:デフォルトの名無しさん
07/11/28 00:49:19
リンカにその情報は渡らんだろ。渡せるように作れるが。
461:デフォルトの名無しさん
07/11/28 07:14:08
>>460
Cの関数はデフォルトだと内部リンケージだったっけ?
462:デフォルトの名無しさん
07/11/28 10:45:04
いいえ。
463:デフォルトの名無しさん
07/11/28 20:12:34
strcpy と wcscpy のようにアルゴリズムが殆ど同じだが扱う型・定数が微妙に違う関数を同時に実装する必要があるとします。
実装しなければならない数は 2~3 型 x 30~40 関数ぐらいとします。
このような場合、
/* strcpy.cpp */
char *strcpy( char *dst_, const char *src_ ) {
char *head = dst_; while( '\0' != (*dst_++ = *src_++) ){ /* nop */; } return head;
}
/* wcscpy.cpp */
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) {
wchar_t *head = dst_; while( L'\0' != (*dst_++ = *src_++) ){ /* nop */; } return head;
}
と一つづつ同じような関数を書いていくのと
/* fallthrough */
464:デフォルトの名無しさん
07/11/28 20:13:12
アルゴリズムだけ書いた
/* template/strcpy.cpp */
#ifdef XCS_IS_CHAR
#define char_t char
#define xcscpy_ strcpy
#define text_( text ) text
#endif
#ifdef XCS_IS_WCHAR
#define char_t wchar_t
#define xcscpy_ wcscpy
#define text_( text ) L ## text
#endif
/* strcpy, wcscpy */
char_t *xcscpy_( char_t *dst_, const char_t *src_ ){
char_t *head = dst_; while( text_('\0') != (*dst_++ = *src_++) ){ /* nop */; } return head;
}
のようなテンプレートを用意して
/* strcpy.cpp */
#define XCS_IS_WCHAR
#include <template/strcpy.cpp>
/* wcscpy.cpp */
#define XCS_IS_CHAR
#include <template/strcpy.cpp>
と読み込ませるので、どちらが良いと思いますか?
あるいは、もっと良い方法がありますか?
465:デフォルトの名無しさん
07/11/28 20:16:38
ちなみに発想は VC++ の crt のソースからです。
>>464 の訂正 /* ファイル名が逆 */
/* strcpy.cpp */
#define XCS_IS_CHAR
#include <template/strcpy.cpp>
/* wcscpy.cpp */
#define XCS_IS_WCHAR
#include <template/strcpy.cpp>
466:デフォルトの名無しさん
07/11/28 20:16:53
C++だったら、C++の関数テンプレート機能を使う方がいい
template<typename T> T *xcscpy( T *dst_, const T *src_ ){
T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head;
};
467:デフォルトの名無しさん
07/11/28 20:21:52
>>466
でもここは残念ながらCのスレ
468:デフォルトの名無しさん
07/11/28 20:50:08
同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが
469:デフォルトの名無しさん
07/11/28 20:52:18
早速の回答ありがとうございます。
共有するヘッダには C++ を使えないことになってますが、私のコードの中だけでも許可が出れば
/* strcpy.cpp */
template<typename T> T *xcscpy( T *dst_, const T *src_ ){
T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head;
};
char *strcpy( char *dst_, const char *src_ ) { return xcscpy( dst_, src_ ); }
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) { return xcscpy( dst_, src_ ); }
/* strcpy.h */
char *strcpy( char *dst_, const char *src_ );
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ );
とは書けますね。
訊いてみます。
ただ、'\0' を 0 としなければならないのが少し気になります。
関数によっては既存の定数や関数を参照しなければならないところもあるので
#define INVALID_INPUTCHARS "*?\"<>|\a\b\t\n\v\f\r" /* 入力禁止文字群 */
#define t_( text ) L ## text
#define xt_( text ) t_( text )
strhoge(){ return strpbrk( test_, INVALID_INPUTCHARS ); }
wcshoge(){ return wcspbrk( test_, xt_( INVALID_INPUTCHARS ) ); }
のような変換も自動で出来ると嬉しいのですが。
470:デフォルトの名無しさん
07/11/28 20:59:13
>>468
ファイルスコープにしてファイルを分ければ可能
471:デフォルトの名無しさん
07/11/28 21:03:42
>>468
>同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが
できますよ、というか出来てます。#undef まで書けば同じファイルにすら実装できます。
下の 2 ファイルを用意して test.cpp をプリプロセッサにかけてみてください。
/* ./template/test.cpp */
#ifdef TYPE_A
#define type_ type_ar
#define name_ func_a
#endif
#ifdef TYPE_B
#define type_ type_b
#define name_ func_b
#endif
type_ *name_( type_ *param );
#undef type_
#undef name_
/* ./test.cpp */
#define TYPE_A
#include "./template/test.cpp"
#undef TYPE_A
#define TYPE_B
#include "./template/test.cpp"
#undef TYPE_B
472:デフォルトの名無しさん
07/11/28 21:10:02
>>471
それでいいならこれでもいいんじゃない?
#include<stdio.h>
#define DEF_SWAP(type) void swap_ ## type(type *a, type *b){type c;c=*a;*a=*b;*b=c;}
DEF_SWAP(int)
DEF_SWAP(char)
int main(void)
{
char val_char[2]={'A', 'B'};
int val_int[2]={1234, 5678};
printf("%c %c\n", val_char[0], val_char[1]);
swap_char(&val_char[0], &val_char[1]);
printf("%c %c\n", val_char[0], val_char[1]);
printf("%d %d\n", val_int[0], val_int[1]);
swap_int(&val_int[0], &val_int[1]);
printf("%d %d\n", val_int[0], val_int[1]);
return 0;
}
473:デフォルトの名無しさん
07/11/28 21:15:40
いつだったかム板のどこかで C 言語で STL ってのを見た記憶がある
もちろんマクロ全開で使いまくりだが、中身を見なければ幸せだった気がする
474:デフォルトの名無しさん
07/11/28 21:20:23
昔こんなんなら書かされた記憶はある。やっつけで再現してみた。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
475:デフォルトの名無しさん
07/11/29 01:29:50
>>473
これか?
URLリンク(sourceforge.jp)
476:デフォルトの名無しさん
07/11/29 06:41:15
統合開発環境なににしようか迷っているんですが・・・orz
アドバイスください。。。
477:デフォルトの名無しさん
07/11/29 08:41:56
>>1 読め
478:デフォルトの名無しさん
07/11/29 09:38:48
こんなところにマルチしに来ててワロス
479:デフォルトの名無しさん
07/11/29 11:50:29
・半角アルファベットの文字列を引数をして、文字列に含まれる大文字を
すべて小文字に変換する関数tolower_strを作成せよ
・この関数を用い、入力した半角アルファベットの文字列に含まれる大文字を
すべて小文字に変換し表示するプログラムを作成せよ
コード
#include<stdio.h>
void tolower_str( char []);
int main(void){
char str[256];
printf("文字列を入力して下さい:");
scanf("%s",str);
tolower_str(str);
printf("%s",str);
return 0;
}
void tolower_str(char t[]){
int k;
for (k=0;k!='\0';k++){
if(k>='a' && k<='z'){
k=k+'A'-'a';
}else if (k>='A' && k<='Z'){
k=k+'a'-'A';
}
}
}
実行結果
文字列を入力して下さい:TEST
TEST
変換できないのですtt教えて下さいlol
480:デフォルトの名無しさん
07/11/29 12:07:03
>>479
小文字を変換しようとしてるのはどうして?
まあそれは置いといて、
for (k=0;k!='\0';k++){
ここでkを0に初期化してる(k=0)のに、0だったら抜ける(k!='\0')判定してるから
481:デフォルトの名無しさん
07/11/29 12:08:32
もっと言うと、文字はkじゃなくてt[k]だろ。
482:デフォルトの名無しさん
07/11/29 12:12:48
つーか、宿題スレか初心者スレへどうぞ。
483:ニャン
07/11/30 18:15:48
いくつか聞きたいことがあります
友達が検索エンジンに一括登録するソフトを作ったそうなんですが
ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?
それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません
それから乱数の関数の使い方教えて下さい
あと
画像の表示方も教えて下さい
484:デフォルトの名無しさん
07/11/30 18:18:08
次の患者さんどうぞ
485:ニャン
07/11/30 18:21:03
友達が検索エンジンに一括登録するソフトを作ったそうなんですが
ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?
それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません
それから乱数の関数の使い方教えて下さい
あと
画像の表示方も教えて下さい
486:デフォルトの名無しさん
07/11/30 18:24:22
関連が無いものを複数いっぺんに聞くなよ・・・
あと環境依存のやつはそれなりのスレで。
487:デフォルトの名無しさん
07/11/30 18:28:15
>>483
> ネット上のボタンをクリックしたり コメント枠に書き込んだり
> するのはどうやってプログラムするのですか?
ブラウザがどういう仕組みで動いているのかを調べれば、どうやってプ
ログラムするかもわかるようになるよ。HTTP とか HTML とかね。
488:ニャン
07/11/30 18:28:18
すみません
いろいろ困ってたんで
せめて1番上だけでも答えてください
お願いします
ところで 環境依存ってなんですか?
489:ニャン
07/11/30 18:30:40
ブラウザってどうやって見るのですか?
490:ニャン
07/11/30 18:36:20
俺 コマンドプロンプト内で文字を表示させるくらいまでしか プログラムできないんで
もっと詳しく教えて下さい
491:ニャン
07/11/30 18:45:33
その友達に訊けばいいんじゃないですか。
492:デフォルトの名無しさん
07/11/30 18:48:52
まず >>1 を読め
読み終わったら >>1 を読め
一回休んで、もう一度 >>1 を読め
ついでに >>2 も読んでおけ
493:ニャン
07/11/30 18:49:23
教えてくれないんです
494:デフォルトの名無しさん
07/11/30 19:36:43
これはひどい
495:デフォルトの名無しさん
07/11/30 20:01:15
9,6,4,7,12,14,1,11,10,15,3,5,8,13,2を小さいものから順に並び替える関数です。
0 #include<stdio.h>
1 void quicksort(int x[],int n){
2 int m;
3 int *pa=x+2. *pz=x+n
4 if(n==2){
5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m;
6 return;
7 }
8 while(pa<pz){
9 while(pa<=x+n && *pa<x[1])pa++;
10 while(pz>=x+2 && *pz>=x[1])pz--;
11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m;
12 }
13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m;
14 if(pa-x>2)quicksort(x,pa-1-x);
15 if(x+n-pz>1)quicksort(pz.x+n-pz);
16 }
これの8~12行目の部分は、9行目で前から数列の6,4,7,12まで進み、
10行目で後ろから2まで進み、12と2を交換するという意味であってますか?
496:デフォルトの名無しさん
07/11/30 20:04:18
>>495ですが、もしかしてスレ違いですか?
497:デフォルトの名無しさん
07/11/30 20:15:03
そうです
次の患者さんどうぞ
498:デフォルトの名無しさん
07/11/30 22:40:30
Cで動的初期化というか、やりたいのは以下のような感じなんだが、
いいアイディアない?
あるヘッダファイルに以下のような定義がある。
typedef const struct ID_ {
uint32_t a;
uint8_t bc[2]
} * ID;
extern const ID ID_HOGE;
んで、実体は以下のような感じ。ちなみにID_HOGE_は公開されていない。
static const struct ID_ ID_HOGE_ = {0xaaaa, {0xbb, 0xcc}};
const ID ID_HOGE = &ID_HOGE_;
んで、このIDと名前みたいなヤツの対応を静的に書いておきたい。
struct {
ID id;
char *name;
} MAP;
static struct MAP map[]={
{ID_HOGE,"hoge"},
...
};
だが、動的な初期化が出来ないってコンパイラにはじかれてしまう。
どうしたらいい?ボスケテ天才プログラマー。
499:デフォルトの名無しさん
07/11/30 22:47:26
static struct MAP map[]={
{&ID_HOGE_,"hoge"},
...
};
500:デフォルトの名無しさん
07/11/30 22:52:31
>>499
いや、上にも書いたとおり、ID_HOGE_は公開されていなくて、
実体があるソースコードも書き換え不可なんですよ・・・。
501:デフォルトの名無しさん
07/11/30 23:23:44
今日からC言語の勉強を開始しようと思っていますが、初心者でも使いやすい
コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?
502:デフォルトの名無しさん
07/11/30 23:28:12
つ『14歳からはじめるC言語わくわくゲームプログラミング教室』
URLリンク(www.amazon.co.jp)
Borland C++使ってる。
503:デフォルトの名無しさん
07/11/30 23:29:45
>>500
やりたいこと、よくわかんねけどさ。
こうじゃあかんの?
struct MAP{
const ID *id; // <ポインタに
char *name;
};
static struct MAP map[]={
{&ID_HOGE,"hoge"},
};
// 使用例?
int main()
{
printf("%x\r\n", (*map[0].id)->a);
return 0;
}
504:デフォルトの名無しさん
07/11/30 23:39:05
>>502 まだまだ軍資金がないもんで、フリーでできるものを願いします
505:デフォルトの名無しさん
07/11/30 23:42:27
最長共通部分列(LCS)問題について教えてください。
ある座標系が2つ(x1,y1),(x2,y2)が存在して、その座標系に
それぞれ10個の要素があったとします。各要素のx1,もしくはx2座標
とy1,y2座標に重複はないものとします。
要素 1 2 3 10
ex 座標系1・・・(x1,y1)={(4,3),(2,6),(5,9),,,,(10,1)}
座標系2・・・(x2,y2)={(1,5),(7,5),(9,8),,,,(3,4)}
この2つの座標系において要素間の位置関係が等しくなっている全ての要素の
のなかで一番要素数が多いものを割り出す。プログラミングは
どのように組めばいいのでしょうか?よろしく願いします。
506:デフォルトの名無しさん
07/11/30 23:48:20
>>501
>>1-2
>>505
>>1-2
507:デフォルトの名無しさん
07/12/01 01:34:09
>>498
そのやりかたではできない。
どうせmapは変更しないのだろうから、ID構造体を隠蔽してそのポインタを提供するのではなく
MAP構造体を隠蔽してそのポインタを提供する方式にするんだ。
// id.h
typedef struct{
uint32_t a;
uint8_t bc[2]
}ID;
typedef struct{
const ID *id;
const char *name;
}MAP_;
typedef const MAP_ * const MAP;
extern MAP map;
// id.c
static ID ID_HOGE_ = {0xaaaa, {0xbb, 0xcc}};
static MAP_ map_[]={
{&ID_HOGE_,"hoge"},
...
};
MAP map=map_;
これでいけるはず
508:デフォルトの名無しさん
07/12/01 02:04:09
>>507
どこがMAPを隠蔽してるんですか?
509:デフォルトの名無しさん
07/12/01 03:12:18
>507
hogeの実体部分のソースは変更不可だってんだからそれは駄目だろ
静的な初期化はあきらめて、mainの頭で初期化するか
map要素を返す関数を用意してそれが最初に呼ばれたときに初期化するかしかないな
510:デフォルトの名無しさん
07/12/01 13:01:43
/* map.h */
ID map_ID(int);
const chat * map_name(int);
/* map.c */
struct {
ID *id;
char *name;
} MAP;
static struct MAP map[]={
{&ID_HOGE,"hoge"},
...
};
ID map_ID(int n)
{
const chat * map_name(int n);
511:デフォルトの名無しさん
07/12/01 13:03:25
途中送信しちった
/* map.c */
struct {
ID *id;
char *name;
} MAP;
static struct MAP map[]={
{&ID_HOGE,"hoge"},
...
};
ID map_ID(int n)
{
return *map[n].ID;
}
const chat * map_name(int n)
{
return map[n].name;
}
これでいいんじゃ?
512:デフォルトの名無しさん
07/12/01 16:10:51
>505
もうちょい正確にやりたいことを書かないと無理だと思うんだな。
何がしたいか正確には分からないけど多分 LCS とは別物だと思う。
>重複はない
座標系1の点 { (x10, y10), ... , (x19,y19) }
座標系2の点 { (x20, y20), ... , (x29,y29) }
で、どう重複がないのよ?i ≠ j なら x1i ≠ x1j って言ってるの?
>要素間の位置関係が等しくなっている全ての要素ののなかで一番要素数が多いもの
座標系1 に対して並行および回転移動を行った際、座標系1の点と座標系2の点とが一致する数が最大となる移動時での
一致する点の組みを選び出せばいいの?
513:デフォルトの名無しさん
07/12/01 17:47:56
スレの趣旨から外れた質問は流せって
514:デフォルトの名無しさん
07/12/01 22:41:50
プリプロセッサってたいがい
#define hoge
って書いてあるけど、インデントやスペースを挟んだ
# define hoge
みたいな書き方も規格的にOKですか?
515:デフォルトの名無しさん
07/12/01 22:42:09
うん
516:デフォルトの名無しさん
07/12/01 23:16:53
字下げするときはそうすることが多いよNE
517:デフォルトの名無しさん
07/12/01 23:54:57
ありがとうございます。
自信を持ってインデントします。
518:デフォルトの名無しさん
07/12/02 01:45:27
>>511
ポインタのポインタをコンパイラ制限のために、さらにポインタに
するなど受け入れがたいため却下。
IDの比較はどうする?ポインタのポインタのポインタだから、
値を比較するには、ポインタのポインタn・・・とか、
ポインタのポインタが静的に定義されているから、
ポインタのポインタのアドレスで比較すればいいとか、
コピーするにはうんぬんとか。
ヤッテラレッカボケ!
519:デフォルトの名無しさん
07/12/02 01:52:34
可能なら、動的初期化できるC++としてコンパイルすればほぼ498のコードで通る。
これだけのためにそうするのは少々無駄遣いという気もするけど。
520:デフォルトの名無しさん
07/12/02 03:07:50
>518
IDはポインタだからID *はポインタのポインタどまりだろうが
お前はまず教科書読み直せ
521:デフォルトの名無しさん
07/12/02 03:11:31
>>520
アゲアシとってナニが楽しいのかね。そうやって
見下すことでオノレの存在価値を認識する作業を繰り返す
人生なんてオワリにしたほうがいいよ。
522:デフォルトの名無しさん
07/12/02 03:18:59
>>521
こんなところで見下されてる人生なんてオワリにした方がいいよ
523:デフォルトの名無しさん
07/12/02 03:36:44
このあいだ関数プロトタイプ使いたくないとぬかしてたボケと同じ臭いがする
524:デフォルトの名無しさん
07/12/02 10:12:37
>>518
その程度で受け入れ難いなら、まず「C言語を使う」という選択肢を捨てるべき。
C言語しか使えないならC言語の制限は受け入れるしか無いだろ。jk
525:デフォルトの名無しさん
07/12/02 10:34:24
>>524
同意。言語の制限が枷になるなら言語選択からやり直すべき。
526:デフォルトの名無しさん
07/12/02 11:21:12
Dおすすめだにょ!
527:デフォルトの名無しさん
07/12/07 12:25:18
整数型のオーバーフローについて質問です。符合無し型ではラップすると規定されていて、
符号付き型では未定義動作になると理解しました。
その場合、以下のようなコードは「ラップする」と「未定義動作」のどっちになるんでしょうか?
unsigned char c = 1;
c += INT_MAX;
期待する動作としては符号無しのルールに従ってラップした結果が c に残って
欲しいんですが、 c = c + INT_MAX の右辺の c は int (符号付き)に格上げされて
しまうので、未定義動作という解釈もできるように思います。
後者の場合、未定義動作を避けるためには明示的に
c = (unsigned int)c + INT_MAX と書く必要があることになってしまいそうですけど、
ちょっと意味不明なコードになってしまいます。
528:デフォルトの名無しさん
07/12/07 12:38:32
c += (unsigned int)INT_MAX;
529:デフォルトの名無しさん
07/12/07 21:00:23
c = (unsigned char)((unsigned int)c + INT_MAX)
無理して規格の解釈ギリギリのコード書く必要もあるまい。
530:デフォルトの名無しさん
07/12/08 09:39:13
もしかして下線1文字 _ って予約識別子ではない?
531:デフォルトの名無しさん
07/12/08 10:45:41
予約識別子は __func__ だけじゃないかな。
予約マクロにも下線二文字か下線+英字と最低二文字を想定しているっぽいし、
下線一文字は処理系で特別に解釈されるようなことはないと思う。
普通に変数名としても使えるし。
532:デフォルトの名無しさん
07/12/08 11:51:47
下線1文字 _ は
・二重下線を含む
・下線 _ で始まり英数文が続く
どちらのルールにも当てはまらない。
だから「予約識別子ではない」だろうね。
>予約識別子は __func__ だけじゃないかな。
>
>下線一文字は処理系で特別に解釈されるようなことはないと思う。
>普通に変数名としても使えるし。
たとえ予約識別子だろうと "普通に変数名として使える" よ。
"処理系で特別に解釈される" のではなく "処理系が既に使っている可能性がある" 名前。
533:デフォルトの名無しさん
07/12/08 12:06:58
何を以って普通と言うかはわからないが、未定義の動作が伴うことは"普通に変数名として使える"と言えるのか?
処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
処理系依存としか言えない。
534:デフォルトの名無しさん
07/12/08 12:52:31
C99しか見て無いけど。
>>530
ファイルスコープは予約されてるっぽい。
>>531
マクロ名も識別子らしい。
自分から進んで規格見ないから勉強になるわぁ。
C89はシラネ。
どっかで見れないかね?
お取り寄せメンドイ。
535:デフォルトの名無しさん
07/12/08 13:17:21
>>530
_ はC89の頃から大域名前空間では予約済み。
>処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
というか、処理系は予約識別子も予約されていない識別子も同様に扱う。
名前の上書きが問題になるのは識別子が予約されているかどうかとは別の問題。
例えば
char hoge[]="hoge";
…………
hoge[10] = '\0';
ってコードは言うまでもなく未定義で正しくないコードだが、
それでも "普通に書ける" コードではあろう。
536:デフォルトの名無しさん
07/12/08 13:19:43
"普通"の定義によるんじゃない?
コンパイルが通るだけで普通なのかってことになるだろ
537:デフォルトの名無しさん
07/12/08 13:37:38
そこはコンパイラの説明書を読めとしか。
538:デフォルトの名無しさん
07/12/08 14:50:48
イマサラだけど「普通」って文化の問題だから、
規格と比べて云々しても答え出ないっしょ。
肯定も否定もでけまへん。
539:デフォルトの名無しさん
07/12/08 15:36:42
根本的に間違ってる。
コンパイルできるかどうかも処理系依存だということを忘れてる。
よって処理系に依存しない書き方が普通。
540:デフォルトの名無しさん
07/12/08 16:06:01
C89のコードが普通のところもあれば
C99のコードが普通のところもあれば
gcc依存のコードが普通なところもあれば
言えばキリが無いよ。
何が普通かなんて、語るだけナンセンス。
541:デフォルトの名無しさん
07/12/08 16:30:37
このスレでは普通についての議論はしません
542:デフォルトの名無しさん
07/12/08 16:33:40
予約識別子を予約されていない識別子と同様に扱うことが普通かどうかって話だろ?
とりあえず避けるわな、普通。
543:デフォルトの名無しさん
07/12/08 16:59:17
・赤信号だろうが普通に渡ることはできる。だが普通は渡らない。
・予約識別子は普通に変数名として使える。だが普通は使わない。
どっちも正しい。
二人とも普通の指してる先が違うんだ。
それに気づかなきゃ話が噛み合うわけがない。
544:デフォルトの名無しさん
07/12/08 17:01:06
予約識別子を普通に扱うってのはコンパイラが?プログラマが?
545:デフォルトの名無しさん
07/12/08 17:41:55
>>543
例え話に例え話で返すと話がズレがちなんで嫌なんだが、ちょっと言いたい。
>赤信号だろうが普通に渡ることはできる
規約違反。
精々「横断歩道の無い道を渡る」ぐらいのものだと思う。
車線無しならOK、対向1車線でもまぁ、対向2車線・・・うーん。
という感じで、程度問題ではなかろーか。
546:デフォルトの名無しさん
07/12/08 18:07:53
本筋とズレたところで例え話の粗探ししてどうすんの。
そういう話じゃねえべ。
547:デフォルトの名無しさん
07/12/08 18:25:32
細かい所に拘りたいのも本質さえ掴めれば良しとするのも人それぞれ。
何が普通かと同じで結論は出ません。
548:デフォルトの名無しさん
07/12/08 18:33:52
コンパイルできるのは処理系依存だってことはみんな理解して発言してるんだよな?
549:543
07/12/08 21:47:05
予約識別子は constraint ではないのでCのコードとしては "普通" に使える識別子である。 <= 文法上の問題
ただし、そのようなコードをコンパイルする場合については undefined である。 <= 意味上の問題
だから、そういう書き方は "普通" はしない。 <= 道徳上の問題
「使えない」のか「使ってはいけない」のか「使わない」のかでは全く意味が違う。
だから話が噛み合っていない。
550:デフォルトの名無しさん
07/12/08 21:51:40
道徳というより実作業上の問題じゃね?
551:543
07/12/08 21:55:55
>道徳というより実作業上の問題じゃね?
ん、そっちの方が適当だね。
552:543
07/12/08 22:09:08
あと「誰が」普通に扱うのかっていう主語の混乱もあるな。
俺的に分類してみた。
>>531 ?? (主語:プログラマが)
>>532 文法 (主語:処理系が)
>>533 意味 (主語:???)
>>535 文法 (主語:処理系が)
>>539 意味+作業 (主語:プログラマが)
>>540 文化 (主語:プログラマが)
>>542 作業 (主語:プログラマが)
>>548 意味 (主語:???)
553:デフォルトの名無しさん
07/12/08 22:42:44
>>549
話が噛み合ってないとか以前に、自分の発言の意味を自分自身理解してるのか?
傍目にはお前が一番混乱してるぞ。 電波撒き散らすな。
554:デフォルトの名無しさん
07/12/09 03:07:37
>>553は>>549の何が気に入らないんだ?
真っ当な指摘だと思うがね。
555:デフォルトの名無しさん
07/12/09 11:12:45
さあこんなことを言われてしまった>>553は何がどうどういった根拠で
>>549が混乱しているのか詳しく説明するか、逃げるかふたつにひとつになってしまいました
556:デフォルトの名無しさん
07/12/17 04:56:43
なんで、mallocは1引数関数なのにcallocは2引数なんでしょうか?
557:デフォルトの名無しさん
07/12/17 09:43:27
>>556
calloc()を1引数にしたら存在意義がほとんどないじゃないか。
558:デフォルトの名無しさん
07/12/17 11:18:15
ゼロクリア
559:デフォルトの名無しさん
07/12/17 11:23:22
柳家calloc
560:デフォルトの名無しさん
07/12/17 16:12:57
callocは要らない子
561:デフォルトの名無しさん
07/12/17 16:42:51
>>557
なんで?
562:デフォルトの名無しさん
07/12/18 03:45:39
mallocで確保したメモリを、100x200の2次元配列だとおもってa[m][n]のようにアクセスしたいので、
int* p = (int*)malloc(100*200*sizeof(int));
...
typedef int A[100][200];
A* a = (A*)p;
のようなコードを書いたのですが、これだと使うときに(*a)[0][0]のように*が必要になってしまいます。
どうにか、*を使わずにa[0][0]のように書く方法はないでしょうか。
C++はNGです。
563:デフォルトの名無しさん
07/12/18 03:56:03
>>562
int (*a)[200] = (int (*)[200])malloc(sizeof(int[200]) * 100);
typedef int A[200];
A* a = (A*)malloc(sizeof(A) * 100);
564:デフォルトの名無しさん
07/12/18 08:57:51
int (*a)[200] = malloc(sizeof(int[200]) * 100);
これでいい
565:デフォルトの名無しさん
07/12/19 23:21:25
VC++のstrstr系関数って、KMP法とかBM法で実装されてるんでしょうか?
それと、もし自分で実装するとしたらですが、KMPとBMのどちらが評判よいですか?
566:デフォルトの名無しさん
07/12/19 23:35:28
お帰りください
567:デフォルトの名無しさん
07/12/19 23:44:40
たぶんそんなのは使っていないと思う。
あまりにも短い文字列などだとかえって時間かかるから。
568:デフォルトの名無しさん
07/12/20 02:59:48
絶対使ってない、と言い切れるね。
1回しか使わない探索にテーブルのセットアップとかが無駄と言うのもあるけど
そもそも、そういうスキップする(全文字走査しない)アルゴリズムは
テキストの長さがあらかじめ判ってないと使えない。
そして、(strstrに渡す)文字列の長さをstrlenで調べてからBM法を使うくらいなら
長さを求める'\0'探しのついでに力任せ探索をするほうがずっとまし。
たとえ同じ文字列を何回も探索するような、初期化が必要ないケースでも。
569:デフォルトの名無しさん
07/12/21 00:21:03
ビット操作の練習をしています。符号あり2の補数表現の整数の符号を反転するコードは、
x=(~x)+1;とx=~(x-1);のどちらが適切でしょうか?
570:デフォルトの名無しさん
07/12/21 01:38:53
x=-x;
571:何を以って適切とするかが提示されていないから答えようがない罠
07/12/21 01:39:24
>>569
x *= -1;
572:デフォルトの名無しさん
07/12/21 04:13:19
このスレ的には2の補数表現を仮定してる時点で間違い
573:デフォルトの名無しさん
07/12/21 09:58:35
>>572 は誰に言ってるのか
574:デフォルトの名無しさん
07/12/21 10:09:03
>>573
>>570-571ではなかろうか
575:デフォルトの名無しさん
07/12/21 10:12:04
俺は>>569だと思った
576:デフォルトの名無しさん
07/12/21 11:02:23
>>569
xがunsignedならどっちも同じになるから、どっちでもいいよ。
577:デフォルトの名無しさん
07/12/21 11:52:01
>>576 符号ありと書いてあるが。
578:デフォルトの名無しさん
07/12/21 11:56:24
んー微妙だなw
579:デフォルトの名無しさん
07/12/21 13:00:08
構造体の定義で、たまに
struct X {
...
char tag[1];
}
とか書いてあるものがありますが([0]の場合もあり)、これは何でしょうか?
580:デフォルトの名無しさん
07/12/21 13:08:33
>>579
URLリンク(www.kouno.jp)
581:デフォルトの名無しさん
07/12/21 13:11:49
C FAQ 次スレからテンプレに入れよう
582:デフォルトの名無しさん
07/12/21 13:13:08
>>581
>>1にあるだろ。テンプレ嫁
583:デフォルトの名無しさん
07/12/21 13:15:32
あ、見落とした m(__
しかし、それが何であるかの説明にはなってないなw
しかしこのスレではスレ違いなので、
スレ立てるまでもない質問のほうに答えは書いておく。
584:デフォルトの名無しさん
07/12/21 13:57:03
どうせ規格の話になるんだし、ここで答えてもよかっただろうに。
分散して見づらくなる。
585:デフォルトの名無しさん
07/12/21 14:23:06
心得の意味がわかってないやつがいるなぁ
「わざとスレ違いな質問をする荒らしがいるのでそういうのは無視するか軽く流してください」
次からこう書かなきゃダメか?
586:デフォルトの名無しさん
07/12/21 14:34:52
何でスレ違いなのか、さっぱりわからない
587:デフォルトの名無しさん
07/12/21 14:42:27
>586
どの質問についての話なのかさっぱりわからない
>579についてのことなら、プログラム技法の質問であって規格の質問ではないからだ
588:デフォルトの名無しさん
07/12/21 14:43:51
え、いつからこのスレは規格オンリーなスレになったんだ?
589:デフォルトの名無しさん
07/12/21 14:43:54
何でしょうかって聞かれたらそれは
要素数が1のcharの配列です
としか答えられんよな
590:デフォルトの名無しさん
07/12/21 14:44:56
>>587
規格に準拠したC言語に関するスレであって、規格のスレではなかったはずだが。
591:デフォルトの名無しさん
07/12/21 14:45:53
だから>>579に対する答えは>>589で終わりだ
592:デフォルトの名無しさん
07/12/21 14:46:23
>>2
593:デフォルトの名無しさん
07/12/21 14:47:40
>>587みたいなキチガイが湧くから>>2の注意書きがあるってのに…
594:デフォルトの名無しさん
07/12/21 14:49:45
なんなの、この自治厨
595:デフォルトの名無しさん
07/12/21 14:51:46
なぜ「だから」なのか、さっぱりわからない
596:デフォルトの名無しさん
07/12/21 15:03:45
ざっとこのスレ見直したけど、いかにも>>587の気に食わなさそうな話題がたくさん見逃されてるよ。
何故?
597:デフォルトの名無しさん
07/12/21 15:05:58
なんかいろいろ言われてるけど
スレリンク(tech板:552番)
結局なぜ、こういう使いかたをするのかわからない
598:デフォルトの名無しさん
07/12/21 15:08:10
>>597
向こうで聞け
599:デフォルトの名無しさん
07/12/21 15:17:17
この書き方が文法的に正しいかも移植性が高いのかもともにはっきりしない。ただし、かなり幅広く使われている。この技法による実装は以下のようになる。
#include <stdlib.h>
#include <stdio.h>
struct name *makename(char *newname)
{
struct name *ret
=malloc(sizeof(struct name)-1 + strlen(newname)+1);
/* -1 は頭の [1] 用; +1 は \0 用 */
if(ret!=NULL){
ret->namelen = strlen(newname);
strcpy(ret->namestr, newname);
}
return ret;
}
上の関数は、name 構造体の実体を、引数で要求された名前を保持できるように(構造体の定義から想像する1文字ではなく)大きさを調整して割り付ける。
幅広く使われているけれど、この技はいささか悪名高い。……
以上、CFAQ初版より抜粋
600:デフォルトの名無しさん
07/12/21 16:48:26
なんで、
struct name {
int namelen;
char *namestr;
};
にしないんだろう?二回malloc/freeするのがイヤってことなのかな。
601:デフォルトの名無しさん
07/12/21 16:58:54
ファイルの入出力も1回で済んだしな
602:デフォルトの名無しさん
07/12/21 17:05:11
>>600
そのまま通信用バッファとかに使えるから、流行ってたんだと思う。
603:デフォルトの名無しさん
07/12/21 17:21:32
CG法のプログラムを完成させ、以下のA,bに対する解xを求めよ。
A:
-6.761582e-01 8.649824e-01 5.974179e-01 1.510212e-01 9.412452e-01
8.649824e-01 -9.466491e-01 9.172758e-02 9.491567e-02 3.673389e-01
5.974179e-01 9.172758e-02 8.015639e-01 -7.419281e-01 2.099383e-03
1.510212e-01 9.491567e-02 -7.419281e-01 -2.940182e-01 -6.722990e-01
9.412452e-01 3.673389e-01 2.099383e-03 -6.722990e-01 -8.416333e-01
b:
8.156371e+00
1.463224e+00
2.283493e-01
-6.422500e+00
-5.215142e+00
これってどうやったらできるんですかね?(>。<)
cg法自体よくわかってないんですが…
604:デフォルトの名無しさん
07/12/21 17:22:17
これこそ、正にスレ違いだな。
605:デフォルトの名無しさん
07/12/21 17:26:04
連立方程式の開放の一つだろ
606:デフォルトの名無しさん
07/12/21 17:35:03
URLリンク(ja.wikipedia.org)
607:デフォルトの名無しさん
07/12/21 17:38:06
Lesson6 連立方程式-大規模疎行列-(不完全Colesky分解)
Lesson7 連立方程式-大規模疎行列(前処理つきICG法)
URLリンク(www.saitama-u.ac.jp)
608:597
07/12/21 17:44:58
>>599
なるほどーよくわかりました。
やっぱり、>>600のように書いたほうがいいですね。
609:デフォルトの名無しさん
07/12/21 17:45:59
共益勾配法のことか。
なつかしー。BCG法とかもやらされたなあ・・・
610:デフォルトの名無しさん
07/12/21 19:49:22
処理系依存の話ではなくANSI Cとしての話ですが、
シフト演算で、シフト量が0の場合の挙動は定義されているのかな?
それとも未定義?
int x;
x>>= 0:
x<<=0;
とかした場合
611:デフォルトの名無しさん
07/12/21 19:53:12
変化無し
612:610
07/12/21 20:16:42
>>611
どもです。
ANSI C ( JISX3010)
URLリンク(www.jisc.go.jp)
をぱらぱら読んでみましたが、
6.5.7 ビット単位のシフト演算子
を読む限り、負数の場合は未定義とはありますが、0に関しては
特に述べられてませんね。
どの処理系でも
(x >>= 0) == x
(x <<= 0) == x
と想定してFA?
613:デフォルトの名無しさん
07/12/21 20:22:21
c<<(m-n)
という式ではm-n=0という場合もある
614:デフォルトの名無しさん
07/12/21 23:50:39
>612
x >= 0 ならね。厳密に解釈するなら x < 0 なら << は未定義、>> は処理系定義。
615:610
07/12/23 23:40:58
>>614
どうもです。でしたらunsigned int なら大丈夫ですね。
616:デフォルトの名無しさん
07/12/23 23:54:53
>>599あたりの話なんですが、
なぜこの技法はだめなんですか?
特に問題なさそうに思えるんですが
617:デフォルトの名無しさん
07/12/23 23:59:05
C89の規格に「やってもよい」と明記はされてないから。C99なら問題ない。
618:デフォルトの名無しさん
07/12/24 00:03:12
規格を厳密に解釈すると、駄目ということになるから。
URLリンク(www.kouno.jp)
619:デフォルトの名無しさん
07/12/24 00:14:46
Windowsもbitmap周りでやってたな
620:デフォルトの名無しさん
07/12/24 09:56:51
C99 ならサイズ無しで書いとけば可変長メンバが使えるようになったね。
621:デフォルトの名無しさん
07/12/24 10:19:28
>>617
ahosugi
622:デフォルトの名無しさん
07/12/24 10:21:23
>>620
なんで何度も出てることを新しい情報のように紹介してくれるの?
623:デフォルトの名無しさん
07/12/24 10:32:47
安部さんが首相を辞任したね
624:デフォルトの名無しさん
07/12/24 10:47:43
中日ドラゴンズが日本一になったね
625:デフォルトの名無しさん
07/12/24 10:53:53
C99対応のコンパイラってGCCぐらいかな?
626:デフォルトの名無しさん
07/12/24 10:55:47
GCCがC99に対応したね
627:デフォルトの名無しさん
07/12/24 10:56:34
そう。でもGCCでも完璧に対応してるわけじゃないけどね。
URLリンク(gcc.gnu.org)
628:デフォルトの名無しさん
07/12/24 11:09:16
DMCをお忘れではありませんか。
こっちも完璧ではないけどね。
629:デフォルトの名無しさん
07/12/24 11:12:56
VCも少しは見習え
630:デフォルトの名無しさん
07/12/24 11:48:35
数年前のC99をいまだ対応させないコンパイラって・・・
昔との互換性?それとも技術的に改良部分が多いのか?難しいのか?
よくわからないけど
631:デフォルトの名無しさん
07/12/24 11:50:12
そりゃC99に対応させても努力が多いわりに実入りが少ないなら
当然じゃない?ビジネス的にはC++かC#を使ってってこと。
632:デフォルトの名無しさん
07/12/24 13:02:19
iccはc99だし、SunWorksのccもc99だけどね。
633:デフォルトの名無しさん
07/12/24 13:20:11
>>629
620は、少なくともVC++ 7.1以上なら独自拡張扱いで使える。
URLリンク(msdn2.microsoft.com)(VS.71).aspx
634:デフォルトの名無しさん
07/12/24 21:17:49
fread関数でサーバーにあるファイル(ファイルサイズ1G)を読む際、
読込みサイズを32*1024*1024にするとエラーがおきなくて、
読込みサイズをファイルサイズにするとエラーが起きるのはどうしてでしょうか
?
どなたかご教授下さいm(_願_)m
635:デフォルトの名無しさん
07/12/24 21:21:44
そんなに大量のメモリをいっぺんに確保できていないのだろう。
636:デフォルトの名無しさん
07/12/24 21:23:47
エラーってなんだよ
637:デフォルトの名無しさん
07/12/24 22:07:40
634です。
スレ違いでした。失礼しました。
638:デフォルトの名無しさん
07/12/25 00:36:13
規格の話以外はスレ違いだと騒ぐのに、コンパイラの話になると嬉々として話題に加わる
639:デフォルトの名無しさん
07/12/25 00:49:57
>>638
なんでそう必死なんだ。
640:デフォルトの名無しさん
07/12/25 00:52:13
コンパイラの規格準拠度なんて、まさにこのスレの守備範囲だろ。
641:デフォルトの名無しさん
07/12/25 21:23:25
実装に特化したスレってあったっけ?
642:デフォルトの名無しさん
07/12/25 21:23:58
↑「実装すること」に特化した
643:デフォルトの名無しさん
07/12/25 21:27:32
「コンパイラ・スクリプトエンジン」相談室12
スレリンク(tech板)
とかか?