1 :
デフォルトの名無しさん :
2006/02/10(金) 20:13:45
2
echo 乙
6 :
デフォルトの名無しさん :2006/02/10(金) 21:11:16
>1 GJ!
8 :
デフォルトの名無しさん :2006/02/10(金) 22:13:30
C言語のうまい使い方を教えてください
10 :
デフォルトの名無しさん :2006/02/10(金) 22:37:47
>9 C言語って日常生活ではどんなところに使われてるんでしょうか
>>10 お前の身の回りの家電にでも使われてるんでないの?
知らんけど
16 :
デフォルトの名無しさん :2006/02/11(土) 00:12:02
>>10 そうだなあ。俺の日常の場合、たとえば今これ書くのに使っている
Linux とか X Window System とかは C だ。
この前自宅に2台目の玄箱を買ったが、当然これも Linux だ。
つまりこの中もCだらけだ。
ということで俺の日常はCなしでは成り立たない。
Cはぼちぼち使えるようになってきたんだけど C++にはどうやって移行するのがいい? なんかきっかけがつかめなくて
Cは高級アセンブラ
別にCでコンピュータさんが動いてるわけじゃない
最後に動くのは機械語なんで、
>>10 はちょっと聞き方変えたほうが良いと思う
共用体の有効な使用方法教えてください
おしえてください。 if( )の( )の中には if( (a==1 || a==2) && (b!=1 && b!=2) ) このように数式みたいに書いてもいいものなんでしょうか?
つか前スレ埋めろよw
ネタは結構です
つーか共用体の存在価値を教えてください
>>21 ネタに使う
>>25 知ってる人が少なめっぽい気もするから
知識だけ自慢できる
>>21 Direct Xの構造体でたまに見かけるな。
直交座標と極座標のいずれでも表現できるがいずれか一方しか必要ないってときに
同じ名前の変数を別の使い方するのでなく、名前は別だが余分なメモリは使わない
みたいな、そういうひどい使われ方をしてたりする
あとは即値を見たいときとか、アライメントに抵抗するときとかか
29 :
デフォルトの名無しさん :2006/02/11(土) 02:13:09
メモリやプロトコルをケチるときだな
PCで動かすなら共用体なんか要らん
Undo/Redoで共有体をうまく使ってたライブラリを見たことがある。
unionてつづりはなんかカッコイイ
33 :
デフォルトの名無しさん :2006/02/11(土) 03:24:36
>>29 ケチるためとも言えるが、無駄を省くためとも言える。
union { int i; unsigned char ch[sizeof (int)]; } n; n.i = 0x1389A39B; for(i = 0; i < sizeof n.ch; ++i) { printf("%d\n", n.ch[i]); } とかやって遊べる。
そしてそれを教授に見せて殴られる
// 乙
37 :
92年のソース :2006/02/11(土) 05:03:03
Cで書かれたプログラムをBoland5.5でコンパイルしようと したのですが、 #include<graphics.h> #include<dir.h> が無い様で、コンパイルできずに困っています。 どなたか、この2つのファイルを含むコンパイラーを教えて下さい。 よろしくお願いします。
TurboC 2.0 TurboC++ 1.01
39 :
92年のソース :2006/02/11(土) 05:12:12
40 :
92年のソース :2006/02/11(土) 05:48:10
度々すみません。 どうも、TurboC 2.0も、TurboC++ 1.01も もう手に入らない様なのですが、 他に何か手に入りそうなものでは無いのでしょうか?。
めちゃくちゃ懐かしいな、おい。
realloc はそのまま伸ばせない場合は再確保&コピーになりますよ、と。 >前スレ最後
fseekやftell関数って4GB以上のファイルに使っては駄目ですか?
64 ビット環境なら大抵 long が 64 ビットになって大丈夫だと思うけど、 32 ビット環境だと難しい。 環境依存で 64 ビットで取得/設定できる代替関数があるとおもうんで、 それを使うがよろし。
無限ループをリダイレクトしたらなかなか終わらず、 途中で無理やり終わらせたら83.1MBのテキストファイルができた(´・ω・`)ショボーン。
for(;;) printf("(´・ω・`)ショボーン"); (´・ω・`)ショボーン(´・ω・`)ショボーン(´・ω・`)ショボーン(´・ω・`)ショボーン
なぁ
>>47 のリダイレクトをすれば復元ソフトでデータを復元できなくなるんじゃないのか?
50 :
49 :2006/02/11(土) 13:14:55
今実験してみてるんだがフォルダが1つだけでそれ以外復元されていない。
>>49 どの程度の復元ソフトを望んでるのかわからん(´・ω・`)がな
rewriteされたようでされていないなんてザラにあるで
52 :
49 :2006/02/11(土) 13:21:52
>>51 今きずいたが同時に書き込みされてますね。
素数を1GB分出力させたことがあったなぁ。
そっすか
さっき復元というフリーソフトで復元しようとしたんですが、 元のテキストファイル以外の復元は無理でした。 でも0バイトのソフトは何個か出てきました。 これなんかに利用できませんかね?
57 :
デフォルトの名無しさん :2006/02/11(土) 16:11:07
素数を表示するプログラムってどうやって作るのですか?
>>57 妙な事を聞くんだな
int main(){printf("素数");return 0;}
59 :
57 :2006/02/11(土) 16:14:45
60 :
57 :2006/02/11(土) 16:15:31
int main(){printf("2");return 0;}
62 :
57 :2006/02/11(土) 16:18:49
ではユーザーの入力した数字を素数かどうか出すプログラムってありますか?
素数判定 などのキーワードでぐぐれば出てくるような質問ですか?
int main(){ getchar(); printf("数 '字' はNaNです\n"); return 0; }
>>62 つ「エラトステネスのふるい」
よしっ、行け。
>>62 こんな感じでよろしいでしょうか
#include<stdio.h>
int main()
{
int in;
printf("数字を入力してください>");
scanf("%d",&in);
printf("%d は素数ですか?\n",in);
return 0;
}
>>62 > 数字を素数かどうか出すプログラムってありますか?
日本語でおk
この流れワロタww が、ひでぇwww
int main(void) { int in, i=2,; printf("数字を入力してください。" scanf("%d", &in); if(in <= i) printf("そっすね。"); else printf("続きを読むにはここをクリックしてください。"); return 0; }
>>68 ひどい事は無い
みんなちゃんと質問に答えてる
71 :
57 :2006/02/11(土) 17:19:52
いいなぁIDが表示されない板は。 おかげで楽しく釣れたよ。
ああ、釣られてしまった! くやしい!
ここまで俺の自演
(・3・) エェー 自演は疲れますNE
75 :
デフォルトの名無しさん :2006/02/11(土) 17:35:06
#define A100 #define BA #undef A void main( void ) { int hoge = B; } 上記のようなプログラムで、 Aは削除されBは100に置き換わることを期待したのですが、 ダメのようです。何か上手い方法はないでしょうか?
77 :
デフォルトの名無しさん :2006/02/11(土) 17:39:27
78 :
デフォルトの名無しさん :2006/02/11(土) 17:42:51
>>76 説明足らずですいません。例えば、
void main( void ) {
int hoge;
hoge=A;
hoge=B;
}
としたときhoge=Aの方だけエラーが発生するようにしたいのです。
これはCの仕様的に無理なのでしょうか?
>>78 関数の手前で
#ifdef A
#error ?
#endif
>>78 その手の変態ライブラリならC++だけど
boost/preprocessor/slot
これが参考になる。
プリプロセッサしか使ってないからCでも多分使える
81 :
80 :2006/02/11(土) 18:00:39
boost/.../slotのやってることは本質的な内容に絞ると #if X%10==0 #define _1 0 #if X%10==1 #define _1 1 ... #if X%10==9 #define _1 9 #if X/10%10==0 #define _2 0 ... #if X/10000000%10==9 #define _7 9 #define VALUE _1##_2##_3##_4##_5##_6##_7 こんな感じ。 #ifを利用した。力技ですなw
おっと、間違えた #define VALUE _7##_6##_5##_4##_3##_2##_1 だな。 実際にはもっと長い識別子使ってるけどね
83 :
92年のソース :2006/02/11(土) 18:29:00
>>41 >>42 お礼が遅れてすみません。
何とかコンパイルできました。
お力添え、本当にありがとうございました。
84 :
デフォルトの名無しさん :2006/02/12(日) 02:56:57
素数かどうかの判定は、その数未満の素数で割って割り切れるか どうかで判定すればいいだけ。
その数の平方根以下の素数で十分だろ
面倒くさいから、2から順に割ってみればよくね? 割り切れた時点で素数じゃねーし。
それだったら最初から配列にフラグ立てた方が早い
88 :
デフォルトの名無しさん :2006/02/12(日) 05:36:20
>>85 平方根以下? 9が入力されたら3から調べるのか?
>>88 2から始めて3まで調べる。
素数の二乗≦その数 な素数で判定すればいいだけ。
確かに、平方根越えたら割った商は越える前に試した値と重複しますね。 勉強になるます。
平方根よりエストラテネス使うの方が速い。
93 :
デフォルトの名無しさん :2006/02/12(日) 09:23:38
ノストラダムス
94 :
91 :2006/02/12(日) 09:41:45
if(条件) { 処理 } else { /* コメント */ } このようなつくりですと、デバッガでelse文のコメントにブレークをはれません。 そこで処理をしない処理?みたいなのってできますか? それともただ単に ; をつければいいだけですか?
マクロ
97 :
デフォルトの名無しさん :2006/02/12(日) 13:34:10
>>95 最適化の内容によるんで完全に処理系依存だが
例えば
volatile int i = 0;
関数() {
if(条件)
{
処理
}
else
{
i++;
}
}
とか
if(条件)
{
処理
}
else
{
asm("nop");
}
とかやってもだめか?
98 :
デフォルトの名無しさん :2006/02/12(日) 13:52:47
>>95 そんなもん else ブロックなんか作るなよ。見てて気持ち悪いから。
ブレークポイント作りたいなら次の文の先頭に付ければいいじゃ
ねえか。関数の最後だというのならその最後の } の所にできる
だろ? もしできねえデバッカだったらそれはクソだから捨てろ。
99 :
デフォルトの名無しさん :2006/02/12(日) 14:09:37
>>98 デバッガがクソなのかオプティマイザが利口すぎるのか
ここで確定的に論じることは困難と思われ
そういうのって素敵やん?
101 :
デフォルトの名無しさん :2006/02/12(日) 15:32:12
デバッガを使おうってときに最適化をかけたままなユーザへの評価にあえて触れていないことは言うまでもない
c=c;とか入れとくのは?
>そんなもん else ブロックなんか作るなよ。見てて気持ち悪いから。 気持ち悪くても付けろといわれれば付けざるを得ない。 それが仕事なんだよ。 95がどういう意図でelseを付けているかはわからんが・・・
Noと言えない奴はプロとして失格
105 :
デフォルトの名無しさん :2006/02/12(日) 16:55:48
Noと言っても抑えても失格かどうかはクライアントが決めること くだらん定義にこだわってないで金とるに値する仕事をしろ
平方根を求めるのって関数sqrtですよね? これを使えるようにするにはmath.hをincludeすればいいと思うのですがなぜか使えません。 式としてはq=sqrt(i)みたいに書いてます。 何がおかしいのか教えてください。
クライアントの言いなりか とことんレベルが低いな
>>108 で、コンパイル結果とか実行結果とか何も載せないのは何故ですか?
コンパイルしようとすると下のようなのがでます /tmp/ccPQRCAK.o: In function `main': /tmp/ccPQRCAK.o(.text+0x40): undefined reference to `sqrt' collect2: ld returned 1 exit status
112 :
デフォルトの名無しさん :2006/02/12(日) 17:09:47
リンカが狂ってるな 窓から投げ捨てろ
114 :
108 :2006/02/12(日) 17:13:36
今は自分の部屋からTTSSHを使って大学にログインしてやっているので あとで直接大学にてやってみますね
-lm がついてないだけじゃないのか
つか絶対そうだ
>>115 できました〜ありがとうございます
で、その-lmってのは何者ですか?
リンカが狂ってるな 窓から投げ捨てろ
>>91 >>92 エラトステネス→グーグル力29000
エラストテネス→グーグル力155
エストラテネス→グーグル力2
グーグル力たったの2、クズが!
122 :
デフォルトの名無しさん :2006/02/12(日) 18:07:52
スッドレ→グーグル力78100
ある構造体が以下のように並んでいます。 1:一番目に古い情報を持つ構造体 2:二番目に古い情報を持つ構造体 n:一番新しい情報を持つ構造体 並び順 5 1 4 2 3 3 2 4 1 → 5 n n - 3 n - 1 n - 2 n - 2 n - 1 n - 3 n つまりソートをするわけですが、ならべくRAMを使わず、かつ高速にしたいのです。 ご教授お願いします。
まちがいました。 正しくはこっちです。 並び順 n - 3 1 n - 2 2 n - 1 3 n 4 1 → 5 2 n - 3 3 n - 2 4 n - 1 5 n
自分で考えろ。以上、終了!!
そもそもお前はCをやる資格がない
資格なんていらねーよアホw
>>123 「ソート」でぐぐればいっぱい出てくる。
おまいらひど過ぎ。教えてやれよカスどもが!
>>124 やはり最も高速かつ実用的なバブルソートがいいと思うよ。
RAMを使わず高速に…って言ったらHeapSortだろ!
マジレスしとくと普通にQuickでいいだろ
□はいらんかもしれんが、適してはいないな。 ググることすらできない低能に今後プログラムを学んでいくことは困難だ。 言葉を知らない赤ん坊にいきなり経済学を学ばせるのと同じ。
つまんねい質問でした
ようは 456123を →→→→→ ↑ ↓ 123 456 123456←←← こういうこと?
コード変換作業の中からも改善できるところはないか。常に考えています
136 :
デフォルトの名無しさん :2006/02/12(日) 21:30:51
>>123 C は変数についてオンメモリ設計なんで
オンレジスタ設計がしたい場面には向かない
最適化でそういう方面のチューニングがないでもないが
そうなると処理系依存でこのスレの範疇からは逸脱してしまう
順当にはアセンブラでやるだな
RAMを使わずにならファイルに書き出してマージソートに決まってるだろボケ COBOLを見習え
>ならべくRAMを使わず、 ってことは少しは使ってもOKなんでないの?
すみません。用途としては トレースデータを構造体の配列として保存してます。 一定量埋まったら先頭に戻って上書きをしながらトレースデータを格納していきます。 そして、それらを外部に転送する際に一番古いデータを先頭に最新データを最終配列にソートして 転送したいのです。 組み込みシステムなのでRAMをあまり使わず、かつ高速にしたいのです。 イメージとしては134さんみたいなかんじです。
なんでソートせにゃいかんのじゃ
リングバッファで済むのであらば腹を殴る
>>139 ソートしなくても、
→書き込み順
12345678
□□□□□□□□
↑
最新データの書き込み位置
なとき
5→6→7→8→1→2→3→4
と転送すればいいだけじゃないの?
ほんとに組み込みやってる?
転送する際に、 「先頭アドレスからXXバイト分」 って感じにしたいんでないの?
>>141 小さな命が宿ってますので、お腹だけは勘弁して下さい・・・
では指の間に鉛筆はさんで握る 両手
ここでコムソートの出番ですよwwwwwwww
そうです。143みたいな使い方がしたいんです。
それでも依然として「RAMをあまり使わず、かつ高速にしたい」のならソートしないのが正解だと思うがな。 「先頭nバイト」を「バッファから末尾まで」「先頭から残り」の2回に分けて転送すりゃいいだけだし。
149 :
デフォルトの名無しさん :2006/02/13(月) 02:47:21
32*32サイズの画像情報が入っている下記のような配列が複数あるとします。 例)int charaX_X[32*32] // Xは整数が入る 一つ目の「X」はキャラ番号、二つ目の「X」はモーション番号とします。 例)int chara10_01[32*32] この場合10番のキャラの01番目のモーションの画像の配列 以上のような配列を扱うときに次の4つの文字列をつなげて 該当する配列を参照することは可能でしょうか? 「chara」「キャラ番号」「_」「モーション番号」 GBAのソフトを自作していて複数のスプライトの扱い方で悩んでます。 Macromedia DirectorのLingo言語とかだと下記のように value()という関数を使うを変数名の文字列から変数を参照することができます。 ちなみに下記の場合、0が表示されます。 chara1 = 0 Num = 1 put value("chara" & Num)
お前はキャラ番号とモーション番号の対の数だけ 配列宣言するつもりなのか??
151 :
デフォルトの名無しさん :2006/02/13(月) 03:35:39
*str2="hoge"でstrcpy(str1,str2)とやると *str1="ioge"になるんですけど何が原因なんでしょうか
152 :
149 :2006/02/13(月) 03:57:54
>>150 そうはしたくないんですけど
スプライトの変換ツールが1モーション単位でしか変換できないうえに
それぞれ別の配列になっちゃうのでそのまま使うにはどうしたらいいかな
と思ったんです。
下記のような3次元の配列にしたほうがいいですかね?
int char[キャラ番号][モーション番号][画像の配列];
とりあえずがんばります。 ただ、よいトレース関数を作らねば。 本ではfprintfなど使ってるけど組み込みだから使えないんですよね
>>151 どっかで間違えて ++*str2, *str2++, ++*str1, *str1++ のうちどれかをやってない?
>>152 先ず、一度に全部メモリに読み込むのかどうか、だなぁ。
あと、キャラ番号によってモーション番号が変わる場合は、
そういう風に確保すると無駄が多い。
全部同じなら別にいいけど。
int *chara[キャラ番号][モーション番号];
にして、
int mem[最大画像数][32*32];
から適宜割り当ててやるとか、
何か工夫しないとメモリを圧迫するかと。
156 :
149 :2006/02/13(月) 09:42:49
>>155 いろんな画像を扱う場合はそのようにしたほうがいいかもしれませんね。
今回はRPGのキャラチップなのでモーション番号の最大数は同じなので
その点は問題ないと思います。
constで扱えば外部メモリ(カートリッジ)に配置されるので
たぶんそれも大丈夫かと…。確信ではありませんけど。
>>const int chara[キャラ番号][モーション番号][32*32]
157 :
151 :2006/02/13(月) 10:19:55
>>153 アドバイスありがとうございます
そういった表記は自分では書いていません
もう少し具体的に書くと
typedef strcut hoge{
char *name;
int val;
struct hoge *next;
}hoge_t;
このような構造体を使用していて
新しい要素を追加するときに*nameに対してstrcpyを用いています
その際、既存の要素の*nameの先頭がb,d,f,h,...だと
c,e,g,i,...に置き換わってしまいます(
>>151 で示したようになる)
159 :
151 :2006/02/13(月) 10:41:41
>>158 はい、ちゃんとmallocしています
全ての要素に当てはまれば問題個所も特定できそうなのですが
*nameの先頭の文字がa,c,e,g,i,...では問題が起きないので
原因の見当がつかない状態です
>>159 =151
部分部分じゃなく、問題が再現できる最低限のコードを全て載せろ。
話はそれからだ。
そういうのはまずオブジェクトを管理するライブラリから構築した方がいいんでね? 仕様も無しにただ書いてると収集付かなくなる上に、次やるときに同じ苦労を重ねないといけなくなるぞ
これってセーフ? pDataがポインタとして、 if(!pData || !*pData){DoSomething();} ぼんやりと、pData==0の時は*pDataは評価されないと信じてたんですが、 どうも怪しいので教えてください。
>>162 「||」:左から式を評価し、左の式が真の時、右の式は評価されない
「&&」:左から式を評価し、左の式が偽の時、右の式は評価されない
164 :
162 :2006/02/13(月) 11:50:05
>>163 ありがとうございます。
やっぱりそうですよね。おっかしーなぁ…
165 :
151 :2006/02/13(月) 11:52:28
-----ソース----- #include <stdio.h> typedef struct vartable{ char *name; int val; struct vartable *next; }vartable_t; vartable_t *start; vartable_t *vartablealloc(void); void vartableprint(vartable_t *); void vartablenewdata(char *,int); int main(void){ vartable_t *newvar; vartablenewdata("a",0); vartablenewdata("b",1); for(newvar=start;newvar!=NULL;newvar=newvar->next){ vartableprint(newvar); } printf("-----\n"); vartablenewdata("c",2); for(newvar=start;newvar!=NULL;newvar=newvar->next){ vartableprint(newvar); } exit(); }
166 :
151 :2006/02/13(月) 11:55:06
vartable_t *vartablealloc(void){ vartable_t *tmpvar; tmpvar = (vartable_t *) malloc(sizeof(vartable_t)); return tmpvar; } void vartableprint(vartable_t *tmpvar){ printf("%s = %d\n",tmpvar->name,tmpvar->val); } void vartablenewdata(char *name,int val){ vartable_t *tmpvar; tmpvar=vartablealloc(); strcpy(tmpvar->name,name); tmpvar->val = val; tmpvar->next = start; start = tmpvar; } -----実行結果----- b = 1 a = 0 ----- c = 2 c = 1 a = 0
>>159 それ、どっかに (*src |= 1) に相当するコードが入っているだろ。
遅かった・・・ tmpvar->name の領域はどこで確保してんの?
>>164 何がどう問題なのか、具体的に書いてミソ
171 :
151 :2006/02/13(月) 12:37:40
>>168 *vartableallocで*tempvarの領域を確保してるので
tmpvar->nameの領域も確保できていると勘違いしたのが原因でした。
よってtmpvar->nameの領域を確保したところ問題は解決しました。
154,158,160,167,168
アドバイスありがとうございました
172 :
162 :2006/02/13(月) 13:15:40
>>170 すみません。
先週末の話なんで、問題のソースがどこにあったのか忘れてしまいました。
テキストベースの設定ファイルのパーサを書いてて、
設定項目名の文字列が未定義(ポインタ=NULL) または 設定項目名の文字列長が0なら
処理をどうこうする、という箇所の条件判断で、SEGVしてしまったというのが件の問題でした。
その時ポインタがNULLだったかどうか確かめてませんし、
思うに文字列へのポインタのつもりで変なモノ入れてたんでしょうね。
>>169 36男性妻子有ですがよろしいか。
>>172 周りがないので断定はできないけれど、ポインタの初期化ミス。
ポインタ定義したときに明示的に NULLしないと、てきとーな値(ゴミ)が
入っているから、そのゴミアドレス読み込もうとしてSEGVあぼーん。
質問なんですけど、 char型配列の長さを知りたいんですが、 取得する関数ってありますか?
176 :
175 :2006/02/13(月) 15:46:49
関数じゃないという突っ込みは、お兄さん好きじゃないよ
178 :
174 :2006/02/13(月) 15:49:11
>>175 ありがとうございます。
ちなみにそれって最後のヌルは含まれますか?
演算子テラモエス mallocで動的確保したただの配列なら不可能 mallocで動的確保した文字列配列ならstrlenで文字列の長さが判る。 そうでないなら sizeof(array_name) / sizeof(array_name[0])か、 VC++2005限定で _countof(array_name)
>>178 つか文字列の長さかよ。だったらstrlenだ。
charの配列≠文字列
182 :
174 :2006/02/13(月) 15:58:02
うお、アホですいません… とにかく即レスサンクスでした。
ところでCで
>>149 みたいなことできるのか昨日から興味津々なんだが
Delphiはできたなぁ・・・
配列のポインタでやれないのかな? int *chara[キャラ番号,モーション番号] = {{chara01_01,chara01_02... というモノつくって //Cをしばらくつかってないのだが書き方こんな感じだったっけ
なぜ[]の中にカンマがある・・
きっとC#なんですよ
C#なんかもうC系じゃねぇ
>>187 ポインタ使える不安定さは引き継いでいます
(*^ー゚)b グッジョブ!!
うわ、吊ってくる
191 :
デフォルトの名無しさん :2006/02/13(月) 19:50:50
間違ったことが書けることを「不安定」と言うなら「安定な言語」なんざ使えねー いくら言語の中で矛盾を防いでも I/O で間違える PG が書いたコードは結局不安定だし
おーおー暴走しちょるしちょるwwww
利用できるRAMの残り容量がわかる関数とかってありますか?
194 :
デフォルトの名無しさん :2006/02/13(月) 20:07:37
>>193 実記憶か、仮想記憶か
# いずれにせよ処理系依存スレで聞いた方がよさそう
あるよ。 mallocで最大RAMから、だんだん少なくしていってNULLを返さなくなった ところが最大だ。
198 :
デフォルトの名無しさん :2006/02/13(月) 21:24:36
ひたすら文字列入力しまくってヤバクなったところが限界
>>196 ,199
仮想メモリのあるOSだとSWAPPINGするからRAMの残り容量はわかんねぇだろう
202 :
デフォルトの名無しさん :2006/02/13(月) 22:31:38
>>200 それ以前に、UNIX系OSだと ulimit でプロセスごとのメモリの限界を指定できる。
いえ、RAMの残り容量はプログラムを作る際に出力される MAPファイルでわかるんですが プログラム上でわからないものかと思いまして。 とりあえず、普通にCでは無理ということですね。 あきらめます。
また>123か
205 :
デフォルトの名無しさん :2006/02/13(月) 22:46:55
>>203 何言ってんの? MAPファイルで分かるわけないだろ。オマエは馬鹿か?
釣られ乙
208 :
デフォルトの名無しさん :2006/02/13(月) 22:56:28
>>203 >とりあえず、普通にCでは無理ということですね。
なんでそーなるんだよ
処理系依存の手段を C で実装するだけだ
断じて「無理」なことじゃない
210 :
デフォルトの名無しさん :2006/02/13(月) 23:09:27
>>209 どうにでも
外部結合やらキャストやら「標準 C」にある機能を使ってなんとでも
212 :
デフォルトの名無しさん :2006/02/13(月) 23:13:01
↑コイツ逝ね
死ね
>>212 210に聞いてるので邪魔しないでください
216 :
デフォルトの名無しさん :2006/02/13(月) 23:18:31
>>207 MAPファイルで利用できるRAMの残り容量がなんで分かるのか?
組み込み系のコンパイラはわかるよな
うんこは寝て食え
ageてる人間は馬鹿が多いな。
いただきまーす
222 :
デフォルトの名無しさん :2006/02/13(月) 23:41:02
>>220 sage りゃ利口ってわけでもないことを体現してくれなくていいよ
かわいそうな人だ。
標準Cが環境とセット販売と勘違いしてる人がいるスレですね
未だにその方法が明かされない件について。 結局無理なのねw
>>227 先ずは環境が異なることを緩衝するAPI作りから始めろよ
何でも一発で出来ると思ってるからお前はウザがられるんだよ
229 :
デフォルトの名無しさん :2006/02/14(火) 00:20:02
馬鹿は黙ってろ(藁)
まず、超弩級環境依存のコマンドラインアプリ作るアルよ。 これ、hoge とするね。 あと、popen("hoge"...)で、出力読み取るアル。 標準Cでできないことなんて無い、アル。
まぁでも事前説明もなくいきなり組み込み前提で会話されてもなぁ
俺の環境にはpopenが無いんだが。
寝言言ってるってことは、もう寝てるんじゃない?
寝てるってことは、ちゃんとうんこ食ってるってことだな
238 :
231 :2006/02/14(火) 00:36:58
>>233 あったー来たヽ(`Д´)ノ
system("hoge > foo.txt");
fp =fopen("foo.txt", "r");
gets(buf);
>>238 ファイルシステムもリダイレクトも無いんですよ
240 :
231 :2006/02/14(火) 00:41:05
↑ fgets(buf, len, fp); ネ(チュッ!
241 :
231 :2006/02/14(火) 00:42:59
OSと標準Cが何の関係があるんですか?
知 テ 質 質 ヽ l ヽ、Ll {_/__ ノ/ ///;;/ /:l _,. -――‐、 っ ス 問 問 ヽト、 <_ノノノ/;;/ /:::ノ て ト 文 文 |lヾ'', - ' ´ `ヽ、;;//::::/ た 0 で に .| Y へ,_ '' __,,. -'ヽヽ / ひ 成 お か 点 答 対 l | ,tt:ァ、ノ ,.,、__ 〈/ と り っ ? な え し >l '' ノ :: `ー'´ 、/; り 立 と マ の る / l、l ,、ヽ',、 ノ// 登 た 会 ヌ と | ,、 l ノ三ヽ、 、//l 場 な 話 ケ l/ ', ー-- ` // .| ∫ い が ノn /.l _ //レ l ∫ ア ヽ_____,. -/⌒ヽ/ ヾ、_`ヽ _,,. // / ハ ホ r'―‐-、 ヽr'=、、ヽ' /-、::::: : : /// / ノ が
質問文がマヌケですからね
>>244 禿げ同
この手の堂々巡りは質問者の質問の仕方が悪い。
標準Cと言うだけで具体的な答えが返ってくる訳が無い。
最低限、どういう環境でその必要が出たのか書け。
PC向け・組み込み(OSあり)・組み込み(OSなし)でも違うだろ。
でだ。「MAPファイル」「RAMの残り容量を知りたい」「ファイルシステムがない」から
組み込み(OSなし)だと仮定していいんだよな。
誘導もせずに答えてる香具師が馬鹿なだけだと思うが・・・
>>247 だからAPI決めて抽象化しろって言ってるだろ!! (・ω・#)
末端の実装が違うんだから、結局環境ごとに作れってんだ
うんこは寝て食え ( ´Д`)
>>248 あなたは210ですか?
なぜ標準Cでできるというような事を言ったの?
違う人なら邪魔です
250 :
傍観者 :2006/02/14(火) 01:01:39
>>248 「スレ違い」の一言で済む事を、わざわざ掘り返すからそうなる。
Microsoft Esper C-- を使えば、何でもできる。
252 :
249 :2006/02/14(火) 01:04:46
253 :
245 :2006/02/14(火) 01:05:34
>>248 まぁまぁ。質問者の環境によっては抽象化するほどの
メモリの余裕もないかもしれないじゃないですか。
>>247 普通にCで出来るに決まってるだろ。
標準C って、いったいどんな定義? K&R とか ANSI とかの 「 言語仕様 」 の範囲だと言っているのか。 ならば、答えは 「 無い 」。 元質問を読んでみ? > 利用できるRAMの残り容量がわかる関数とかってありますか? Cの言語仕様に、「 関数 」 は1つとして定義されていないから。
出来ると言ってる人に聞いているんです
257 :
デフォルトの名無しさん :2006/02/14(火) 01:15:17
あれ? 手元のISO C99の仕様書には関数の定義があるんですが…
>>255 標準関数がしっかりと定義されている訳だが
このスレではprintfですら使えなくなるのか!!!
>>256 傍観者から言わせて貰う
ウザイ消え失せろ
263 :
245 :2006/02/14(火) 01:19:59
>>256 ですます調で喋ってりゃ良いってもんじゃないだろ。
さっきからアンタの態度無礼だと思うぞ。
で、>245の問いはどうなってるんだ。
>>260 まったくその通りなんですけど、
どうせわからないんだろうと思われるのも癪で…。
仲良くしろよ池沼共
>>264 ダメだって、池沼は同士討ちで数を減らしてくれないと。
266 :
デフォルトの名無しさん :2006/02/14(火) 01:21:56
さ〜てと、ここいらで age とくか
>>193 は赤顔症のため逃亡しました
戻ってきても普通の書き込みは出来ないと思われます
(;´Д`) スミマセンスミマセン
( 八)
〉 〉
いいんだよ・・君のせいじゃないんだ・・ 全部・・全部この環境が悪いんだ・・
おっぱいうpまだー?
>>262 組み込み系で使われているコンパイラは、標準準拠していないものも多々ある。
もちろん、それ以外でもな。
>>262 ちゃんとそこらへんはマニュアルに書かれてるはず
すくなくとも日立のには書いてたなー
>>270 >>271 それなら話は早い。
>>257 の言う ISO C99 なり、
>>258 の言う標準関数に、「 RAM の残り容量がわかる関数 」 が
含まれてるかどうかだ。
で、答えは 「 無い 」 で おk?
すみません。変な質問して。 組み込み系でOSはITRONです。 環境は SH-2の7045でRAMは外付けで512KB×2 です。 とりあえず、色々調べてみます。(一応調べたんですがわからなかったので再度調べます) RAS用にトレース関数を作っていて、他のシステムでも使えるように 残りRAMのX%分をトレース用に確保したくしたかったんですが・・・ 本当にお騒がせしました。すみませんでした。足を洗って出直してきます。
>>263 よかったな環境が出て。
オレも知りたいのでよろしく頼む。
>>273 そるならdefineで事足りる。
システム構成やマップファイルから、手動で計算して設定させるべき。
277 :
デフォルトの名無しさん :2006/02/14(火) 01:42:47
ここはC言語について聞くスレなので 教える義務はありません。以上
>>273 本当は
>>273 を真っ先に明記しないとな
API厨とかわけの分からん奴が湧いてくるぞ
ちなみに俺はITRONなんて見たことも触ったこともねぇww
そもそもいろんな情報(CPU利用率やメモリ使用率などを) を表示しているツールってどうしてんの?
>273 二度と来るな。お前の質問なんて興味ない。 ただ、トレース間巣は僕も興味あるがな。 みんなはどういう風に実装してるのか知らんが。
281 :
276 :2006/02/14(火) 01:52:19
>>273 ついでに、プログラムコードはRAM、フラッシュ、ROMなどの何処に置かれるのか?や
メモリマップドI/Oがどうなっているか?
など、実行中にはわからない情報から算出する必要があるから、
プログラムに埋め込もうと言うのが、そもそもの間違い。
>トレース間巣 w
あらかじめトレース用に領域をセクションきってリンクしたら?
>>279 Windowsだと、デバイスドライバやAPIなどで得られる。
getcとfgetcの違いって何?
本みりゃわかる
287 :
245 :2006/02/14(火) 02:19:48
うわ、ちょっと目を離した隙にこんなにレスが。 書くことが殆ど無くなってしまった…。 トレース領域として使うというのであれば>276さんの仰るとおり 手動で計算するべきです。実行時に動的に割り当てたりはしませんよね。 …環境が出たら答えが返ってくるのがあっという間だったなー。 タイミング逃したorz
289 :
デフォルトの名無しさん :2006/02/14(火) 02:25:27
#define a.txt ってかんじでファイル名を書いておいたやつを char fname[80]; ↑に代入させたいんだけど文字列が上手く理解できてなくて手も足も出ません。 お助けお願いします。 質問age
>>289 #define FNAME "a.txt"
strcpy(fname, FNAME);
てこと?
>>289 #define HOGE "hoge.txt"
char a[80] = HOGE;
>>286 ジャンプ読んだけどわかんね( 'A`)
トレース関数なんてなくても俺の作ったシステムは 問題なし。使う用途がわからん。
ヤングジャンプならわかったかもね
296 :
289 :2006/02/14(火) 02:42:02
>>294 なんってこった・・・まだ水曜じゃねぇorz
わかった・・・・ほとんど同じじゃねーかorz
typedef int* PINT; typedef const PINT PINT_A; typedef PINT const PINT_B; この型定義についての質問なんですけど、 自分の環境だとこの場合、PINT_A、PINT_Bともに int*constと解釈されているようです。 これは仕様なのでしょうか? (PINT_Aはconst int*になると思ってたのに・・・)
300 :
デフォルトの名無しさん :2006/02/14(火) 15:30:12
プログラマの皆様はどんなOSを使ってるのですか?
Windows(XP,2000)とSolaris9(sparc,x86)とlinux(debian,fedora core)とMacOS X 前はブリッジにFreeBSDも使ってたが、今はお役目ごめん状態
オレッチの開発環境はWindowsで対象システムで使用しているOSはitronっす
漢なら自分でOSをつくれ!!
じゃあ漢じゃなくていい
306 :
299 :2006/02/14(火) 21:29:31
>>299 に便乗質問 スマソ
int * const と const int * って、どう違うの?
int x, y; int * const p1 = &x; const int * p2 = &x; *p1 = 10; p1 = &y; *p2 = 10; p2 = &x; 試してみれば分かる。
>>307 前者はconst修飾されたポインタ。つまりポインタの指す先を変更できないが
そのポインタを経由して指されている奴の中身を変更することはできる
後者はconst修飾されたint(const int)へのただのポインタ
だから他の所を指すように変更してもいいが、指している物の中身は変更できない。
310 :
307 :2006/02/15(水) 12:59:11
>>301 WindowsからOSレスまで幅広く行っております。
312 :
デフォルトの名無しさん :2006/02/15(水) 16:24:57
コンピュータシミュレーションを使って研究をやっている学生です。 基本的な質問で申し訳ありませんがどうか教えていただけないでしょうか? srand(time)を使ってrand関数を変化させて実行結果の変化を見ているのですが、 その実行結果を統計処理しろとボスに言われています。 この場合何回分の実行結果を統計にかければよいのでしょうか? もう少し単純な話にすると srand(time)によるrand関数の変化が有限個のパターンでなのであれば その値を教えていただけると助かりますし、 無限なのであれば無限であるとお教えいただければ助かります、ということです。
>>312 ボスの気の済む個数やればいいからボスに聞けや
RAND_MAX回数でもやれば?
統計処理なんだから1000回くらいでいいんじゃね。
「処理系によってrandの実装が異なるから一概には言えない」がこのスレ的な答えだろうね。
>>312 考えてみた。
有限個 だというところまでは、判った。
しかし、その個数については、「 最大でもこの個数以下 」 というところまでしか、判っていない。
最大でも 「 srand( time )における 引数 time のビット幅を n bits としたとき、2のn乗個 」 だ。
319 :
318 :2006/02/15(水) 18:42:47
>>312 追記
しかしだな、
>>312 よ。
想定し得るすべてのパターンについて調べることを、果たして 「 統計 」 と呼ぶのか?
それは 「 全数検査による確率計算 」 なのではないか?
「 統計 」 とは、標本を分析して母集団の傾向を論理的に類推することだろう?
その意味では、
>>315 の言ってることが正しいと思うぞ。
中心値極限定理とかで標本数決定するんでね?
321 :
デフォルトの名無しさん :2006/02/15(水) 19:00:50
>>312 それは研究の基本とか論文の書き方とかって方面の問題で
全然 C の話じゃないね
基本的にスレ違いだけど C の範疇で可能な範囲で答えるなら
rand の返却値をそのまま使ったら再現性がないから、
いったん fwrite/fprintf などでファイルに書き込んでおき、
あとで同じ入力で再試験できるように入力値と出力値をペアで残すべし
つまり「何回分」は srand の引数の組み合わせ数とか言う問題ではない
>>321 シードがおなじなら、乱数も同じなのでは?
srand()に同じ値を入れても、毎回違う乱数を発生する処理系もあるってことか?
323 :
デフォルトの名無しさん :2006/02/15(水) 22:31:05
srand/rand のソースも生データとして添付するわけか # ツェナーダイオード・・・いやいやまさかね
>>312 srand で rand 関数を変化させて・・・というのは、
乱数種に偏りがあるわけで、
本当にちゃんとした統計が見れるのかと言われると自信がないな。
まあ、おそらく問題になるほどではないと思うけど。
srand は一回のみ実行して、それ以降は初期化を行わず、
1回のプログラムの実行で全ての計算を完了させるのが理想的かと。
それ以前に、コンピュータシミュレーションなら rand 関数なんぞ使わんと、Mersenne Twister 法使え。
なんだそういう意味か。 rand()相当のソースなんて短いから、自分で作って、アルゴリズムや初期値を記録しておくだけでもいいかもしれんけど。
シミュレーションの精度を問うのにsrandやrandの造りを問うのは分かるけど 乱数生成器としてでrandを採用することを決めたあとで その統計的信頼度を推定するためにsrandの造りを問うのは、違うと思うけどなぁ
ッツmmmmmmmmミッ ッmmmmmmmmmmmミッ ッmmmmmmmmmmmmm ッmm mmmmmミッ mm,r'::: ミ;= mmmmミッ mm〈r",,ゞィ ´ヨ ●ヾ`、;::::mmmmミッ mm,イ●ノ "'ーヘヽ ヾ、;mmmmミッ mi'` i"ヽ ゛;;,` ゛'''" ゛-';mmmミッ プログラムやってたら m) ゙・ ・'';;::.. _,,..-ー-ツ m いつのまにやらわし、こんな外見なりましてン 〉,_,_,、,、_, _ イ'" /ーゝ' . `i.j.j,j,j,tt゛i,jイj::ノ ,.i' | ''''''''''''''トr,r,r,rrtf,ソ j`〉`゛T'''''''''''''''' l }゛ '"`'" _,,..-";;/ / /.| | m | |` `-ー--''"::::::::/ ./ | | m | | | l:::::::::::::::::::::::/ ./ | | . | | | l:::::::::::::::::::/ / | | | | | ;:::::::::::::::/ / l .l
マジスカ
330 :
デフォルトの名無しさん :2006/02/16(木) 12:16:33
char buf[100]; char str1[] = "ABC"; char str2[] = "DEF"; char s[7]; sprintf(buf, "%s%s", str1, str2); strcpy(s, buf); ちょっとお聞きしたいのですが、 こういう場合の s[6] == '\0' は保証されているのでしょうか?
>>330 その質問は strcpy(s, "ABCDEF"); で s[6]=='\0' か、っていうことだ
から、もちろん保証される。
>>312 いくつデータ取ればいいのかは、
シミュレーションの内容で決まること。
335 :
デフォルトの名無しさん :2006/02/16(木) 16:06:10
フリーでcが使えれるお勧めのコンパイラありますか?
4種類ほどあります。
gcc!!
339 :
むう :2006/02/16(木) 16:49:26
#include <stdio.h> #define N 3 #define M N*N void rec_path(int prevx[N][N], int prevy[N][N], int x, int y) { if (prevx[x][y] >= 0 && prevy[x][y] >= 0) { rec_path(prevx, prevy, prevx[x][y], prevy[x][y]); printf(" -> %d,%d", x, y); } else { printf("%d,%d", x, y); } }
340 :
むう :2006/02/16(木) 16:50:39
/*幅優先探索(これで移動させる)*/ void solve(int a[N][N], int x0, int y0, int x1, int y1) { int x, y; int xqueue[M], yqueue[M]; int h = 0, t = 0; // head, tail int prevx[N][N], prevy[N][N]; for (x = 0; x < N; ++x) for (y = 0; y < N; ++y) prevx[x][y] = prevy[x][y] = -1; xqueue[h] = x0; yqueue[h] = y0; ++h; h %= M; while (h != t) { x = xqueue[t]; y = yqueue[t]; ++t; t %= M; if (x == x1 && y == y1) break; if (x-1 >= 0 && a[x-1][y] != 1 && prevx[x-1][y] < 0) { prevx[x-1][y] = x; prevy[x-1][y] = y; xqueue[h] = x-1; yqueue[h] = y; ++h; h %= M; } if (y-1 >= 0 && a[x][y-1] != 1 && prevy[x][y-1] < 0) { prevx[x][y-1] = x; prevy[x][y-1] = y; xqueue[h] = x; yqueue[h] = y-1; ++h; h %= M; } if (x+1 < N && a[x+1][y] != 1 && prevx[x+1][y] < 0) { prevx[x+1][y] = x; prevy[x+1][y] = y; xqueue[h] = x+1; yqueue[h] = y; ++h; h %= M; } if (y+1 < N && a[x][y+1] != 1 && prevx[x][y+1] < 0) { prevx[x][y+1] = x; prevy[x][y+1] = y; xqueue[h] = x; yqueue[h] = y+1; ++h; h %= M; } }
341 :
むう :2006/02/16(木) 16:51:31
if (!(x == x1 && y == y1)) { printf("cannot achieve from %d,%d to %d,%d\n", x0, y0, x1, y1); } else { printf("shortest path from %d,%d to %d,%d is\n", x0, y0, x1, y1); prevx[x0][y0] = prevy[x0][y0] = -1; rec_path(prevx, prevy, x1, y1); printf("\n"); } }
342 :
むう :2006/02/16(木) 16:55:08
/*メイン関数*/ int main() { int ichi[3][3]; int x1,y1,x0,y0,i,j; printf("目的地は?\nX1=?\nY1=?\n"); scanf("%d%d",&x1,&y1); printf("現在地は?\nX0=?\nY0=?\n"); scanf("%d%d",&x0,&y0); /*配列に0,1のデータ入力(センサで取得)*/ for(i=0;i<=2;i++){ for(j=0;j<=2;j++){ printf("ichi[%d][%d]の値は?\n",j,i); scanf("%d",&ichi[j][i]); } } solve(ichi, x0, y0, x1, y1); return 0; } 長々とすいません。これの表示は「2,2->1,2->1,1・・・」となっているんですが 表示だけでなくそれそれに移動の命令を入れたいのですが、どうすればいいのでしょうか? 例えば2,2->1,2なら「左に移動する命令」を実行して、ロボットを移動させていきたいのです。 移動する命令は適当に「MOVE TO LIGHT」などとしてください。 最終的にはMOVE TO LIGHT -> MOVE TO TOP -> MOVE TO TOP・・・などとしたいのですが・・・ よろしくお願いします。
読みづらい。 どこかにソースうpしてリンク貼ったほうがいいぞ
344 :
デフォルトの名無しさん :2006/02/16(木) 18:54:52
(´;ェ;`)ウゥ・・・。ごめんなさい。 ネット初心者なもんで・・・。
初心者=免罪符
346 :
デフォルトの名無しさん :2006/02/16(木) 19:36:15
>>344 それは自己申告しなくてもわかるからいいよ
「長々とすいません」て気持ちはあって、
だけどどこの「うpろだ」がいいか判断つかなかった
ということくらい初心者でない人なら読めてるよ
そんなことより宿題スレで聞いた方がいいと思うが?
347 :
むう :2006/02/16(木) 19:55:06
質問の意味はわかりますでしょうか? これで宿題スレに投稿したいのですが大丈夫でしょうか?
348 :
むう :2006/02/16(木) 20:10:13
宿題では微妙にないんで、どうかよろしくお願いします。
むかつくので嫌です
ここにいるみなさんに質問( ゜д゜)ノ コマンドプロンクトより、実行ファイル、読み込むtxtファイルを指定、読み込み、 上下逆に表示するプログラムを作ってるんだけど、 MO1行以上のファイルを読み込んだ場合、 確保した領域外にデータを書き込むことになるから、 実行時エラーになるんだが、 どうしたらエラーがでなくなるのかわかりませんorz どなたか教えてください(´・ω・`) ↓ソース
#include <stdio.h> #include <string.h> #define MO1 10 #define MO2 1000 int main(int argc,char *argv[]) { FILE *fp; int i,j; char ab[MO1][MO2]; if(argc<2){ fprintf(stderr,"*********** 操作説明 ***********\n"); fprintf(stderr,"%s ファイル名 \n",argv[0]); }else{ if((fp=fopen(argv[1],"r"))==NULL){ fprintf(stderr,"ファイル \"%s\" が開けません\n\n",argv[1]); fprintf(stderr,"*********** 操作説明 ***********\n"); fprintf(stderr,"%s ファイル名 \n",argv[0]); fflush(stdout); return(0); } for(i=0;fgets(ab[i],MO2,fp)!=NULL;i++){ ab[i][strlen(ab[i])-1]=NULL; } fclose(fp); for(j=i-1;i>=0;i--) printf("%s\n",ab[i]); } return(0); }
自分なりに考えてはみて、 for(i=0;fgets(ab[i],MO2,fp)!=NULL;i++){ ab[i][strlen(ab[i])-1]=NULL; } にif-elseぶっこんで、iがMO1以上になったらforループを抜けるように for(i=0;fgets(ab[i],MO2,fp)!=NULL;i++){ if(i<MO1) ab[i][strlen(ab[i])-1]=NULL; else break; } ってしてみたんだけどうまくいかないorz 流れぶったぎって初歩的な質問ごめんなさい
>>350 malloc()でメモリ再確保しながらするとか
それだと解放し忘れるから、自分でファイル操作関連のライブラリ作るとか
ライブラリの実用性を確かめるために公開するとか
結構耐久性あるライブラリになってきたら売り出すとか
ライセンスに破綻きらして
>>350 が泡を吹くとか
(`・ω・´)9m
>>350 は犯罪者でつね
354 :
デフォルトの名無しさん :2006/02/17(金) 00:25:39
>>350 テキストファイル処理は易しいようで実はバッファサイズという難問が居座っているやっかいな処理だ
# 難問といってもそれはずぶの初心者にとってという程度だが
realloc あたりが使える人なら、他人に聞くまでもなく答えは薄々予感するはずだが
面倒臭そうなのでもっと便利な方法はないかと尋ねたくなる人情はわかる
355 :
350 :2006/02/17(金) 00:32:11
>>353-354 サンクス!
早速のレスうれしいんだけど、
mallock realloc … さっぱりわからない…( TДT)
>>355 とりあえず文字列関連であればいいと思う機能
・文字列を表すなにか(クラスは無理だからBSTRみたいな何かでもいい)
・文字列連結
・文字列取り出し
つまり
typedef struct _string{ int len; char* s; } string;
string* NewString(int slen){
string* s;
s=(string*)malloc(sizeof(string));
s->len=0;
s->s=(char*)malloc(slen);
return s;
}
string* pc2s(char* s){
int len=strlen(s)+1;
string* r=NewString(len);
memcpy(r->s,s);
return r;
}
void DeleteString(string* s){
if(s!=NULL){ free(s->s); free(s) }
}
あとは略
みたいなライブラリを作ってみると楽ということだ罠
357 :
350 :2006/02/17(金) 00:46:21
>>356 ほんとくだらない質問につきあってもらってうれしいんだけど、
もう少し易しくなりませんかね?ヽ(;´Д`)ノ
>>357 それなら簡単
ファイルサイズと同じかそれ以上のメモリをmallocで確保してあげれば良い。
malloc使いたくないなら、ZZZバイトまで使えると決め打ちして、それ以上のファイルが指定されたらコアダンプして終了。
これ最凶
359 :
350 :2006/02/17(金) 01:08:28
>>353-358 >>358 さんのレス参考に
MO1以上の行数のファイル指定したら、
exit使って強制的に終了させるプログラムにしてみたら一応ちゃんと動きました。
みなさんありがとう_(._.)_
>>359 よし良いぞ!
そうやって隠れて逃げて避けまくれ!!
最後は誰からも見えない透明人間になって死んでいけるぞ!
てか俺もうなってる
誰からも相手されない
もっとしっかり根詰めておけばよかった…
C言語を深く知りたいならコレみたいな本ないですか? 図書スレのだとどれがいいんだかわかんない
才能無い人間に薦める本は無い
才能無い人間は他人に何も薦められない
オメーに食わせるタンメンはネー
才能がないんじゃなくて無能なだけだろw
マジレスすると本なんか要らない
オレ遂に見つけたよ。参考書なんかよりもすごい解り易いサイトを・・
マジレスすれば普通にK&Rでいいんじゃね
369 :
デフォルトの名無しさん :2006/02/17(金) 08:08:07
>>359 衝撃の幕切れ! − ここまで巧妙に仕組まれたネタレスが、かつてあったろうか?
禿ワロタ ので、age させて頂きます。
370 :
デフォルトの名無しさん :2006/02/17(金) 09:17:47
>>361 マジレスします。
>C言語を深く知りたい
「 深く 」 の意味が判らないんだけど、要するに初歩の段階はもう過ぎたし、通り一遍の
コードも書けるようになってきた。 もっと掘り下げて 「 奥義 」 的な知識を身に付けたい、
ってことだろうか?
そういうことであれば、コード書くのが一番。 奥義や深い知識なんていうのは、それを使う
必要性がなければ身に付かないと思ふヨ。
漏れは、
>>370 の意見とは違って、初心者ほど良い解説書が必要と思う。
>>361 が初心者・初級者ならば、K&R と アスキー出版 「 C言語入門 」 の組み合わせが、
今でもベストだと思ってる(20年程前は、定番の組み合わせでした)。 K&R が教科書、「 C言語入門 」 が参考書。
昔の本なので、ANSI C 全盛の現在 お薦めするのはどうかなぁ と躊躇したのだが、
両書とも、ANSI C 準拠の改訂版が出てるのね!
本なんかいらねーよw 2ch聞けばいいじゃん。 何で本なんかに無駄な金使わなきゃなんねーんだ。 本を買う香具師はインターネットが使いこなせない無能者。 回線切って吊れよw
その2chで教えてくれる人はどこで聞いて来るんだ
本書く人は実戦で覚えてくる つまり本買わないならいきなり実戦するしかあるまい
376 :
デフォルトの名無しさん :2006/02/17(金) 12:45:40
本っていっても日本の場合はほとんどが 翻訳した本で、日本の作者の本は初心者 向けのばかりだ。日本のライターの技術力は 低いんじゃないか? いや、日本発で世界中で 使われるようになったソフトが少ないから こうなるのか?
377 :
デフォルトの名無しさん :2006/02/17(金) 15:28:00
シェア獲得はブツの良さだけでは決まらないけどね
窓はブツがいいじゃないか エロゲとかエロゲとかエロゲとか・・
たしかにCの規格表は読みやすいよな
エッチな本
>>361 とりあえず C FAQ は全部読んどけ
385 :
デフォルトの名無しさん :2006/02/18(土) 07:18:55
今までアルゴリズムを工夫するのダルポーで全然やってなかったが AVL木ってマジ早いなwwwwwwww ハッシュのほうがいいんだろうが眠い頭じゃハッシュ関数考えるのめんどくせーし、 非決定性有限オートマトンから非決定性有限オートマトンへの変換なんで ノードがどのぐらい必要なのかとか実際にシミュらなきゃわからんから 開番地法なハッシュだと下手すりゃ藪蛇だしな。 (指数オーダーで一応上限は出るからメモリいぱぽい取るってのもアリだが しかし、B木と違って実装楽チンなのに線形探索に比べると体感マジ早いwwwwwバロスwwww
unsigned
途中送信しちゃった unsigned と signed て符号付き符号無しってゆーけど 使い勝手が全く同じなんだけどなんで? unsigned に 負数入れても問題ないし・・・
そうだな。
アルゴリズムって何ですか?
390 :
初心者 :2006/02/18(土) 12:48:19
4つの数字を小さい順に並べ替えるにはどうしたらいいですか?
391 :
デフォルトの名無しさん :2006/02/18(土) 12:52:20
コードブレイカーの問題をやってるんですけどfor文の所でエラーになります どこがいけないのでしょうか?見て分かりましたら教えていただきたいです エラー内容は不正なポインタの使用と出ます。 #include <stdlib.h>と<time.h> #define N 4 int arry[N+1]; void irnd(void); void irnd(void) { int i; srand((int unsigned)time(NULL)); for(i=0;i <= N-1; i++) arry[i] = rand % 9 + 1; }
393 :
デフォルトの名無しさん :2006/02/18(土) 12:59:44
つ rand()
>>393 初歩的なミスに気付かずすいませんでした。でもやったー!!できました!!
大変助かりましたありがとうございますm(__)m
大丈夫、きっと「コピペ」という必殺技でできるようになるさ
397 :
デフォルトの名無しさん :2006/02/18(土) 18:03:25
昔、delphiで少し遊んだことがあって、 その時に、forループで使ったカウンタを ループ抜けた直後に参照すると、 「その値は不定です」みたいな感じのエラーだか ワーニングだかが出たような記憶があるんだけど、(コンパイラの最適化の関係で、と聴いた) C言語の場合、 for (i = 0; i < 10; i++){ /* 適当な処理(iはいじらないよ) */ } ここで i = 10 って保証されてんの?
途中でbreakとかしてなければ、保証される。
399 :
デフォルトの名無しさん :2006/02/18(土) 18:17:47
C++ 初心者なんだけど、 ループ抜けても問題ないよ。 > ここで i = 10 って保証されてんの? これの意味がよくわからないけど
400 :
デフォルトの名無しさん :2006/02/18(土) 18:22:01
あぁ、代入ってことか
レスサンクス > ここで i = 10 って保証されてんの? i == 10 です。 大丈夫そうですね、ありがと
Cだと大丈夫だが、C++だとiを宣言するところで、 違う時があるから注意。
403 :
デフォルトの名無しさん :2006/02/18(土) 18:43:22
for (...) で変数を宣言すると forブロック内でしか有効でしかなかったような気もするなぁと思って 調べてたら、C++の最新の仕様ではそうらしいね。 VS2003では問題なくブロック外でも使えちゃうけど・・。 しかも同じforループをもう一つ作っても 何も言われないなんて・・・。
>>402 スレ違い。
駄菓子菓子。CでもC99だと
int i;
for (int i = 10; i < 10; ++i) ;
このときのiの値は保証されない。
>>403 VC++2003で使えるのはどう考えてもバグとしかいえない
VC++6のMS拡張仕様を一応受け継いでいるから。
VC++2003からMS拡張のこのforスコープ部分だけはずすことが可能になった。
>>405 それ2005で直ったんじゃなかったっけ?
407 :
デフォルトの名無しさん :2006/02/18(土) 18:58:21
2005 では C++ の最新仕様に準拠したらしいですよ。
2003ではそういうとこが多すぎて間に合わなかったんだよ 「VCはVCで作りました」って言えなくなるからね
俺は単に互換性のためだと思うけどな。 VC6用に書かれたプログラムも標準C++に則って書かれたプログラムもコンパイルできるように。 ただforに関してVC++ 7.1(.Net 2003)ではコンパイルオプションで規格通りの挙動にできる。 そもそもここは標準Cスレだ。スレ違いだ。
割り込みの質問ですみません。 次のコードをコンパイルして実行すると"take"と印字されると 思ったのですが、Bus Errorとなりました。 結果が腑に落ちないのですが、 文字列のリテラルを変更したから エラーになったという理解で正しいでしょうか。環境はMac OS X (10.4.5)でコンパイラのバージョンは gcc 2.95.2です。 よろしくお願いします。 #include <stdio.h> int main(int argc, char* argv[]) { char* array[] = {"sake", "toba", "ikura"}; char** p = array; (**p)++; printf("%s¥n", *p); return (0); }
うん
こ
413 :
プログラマ :2006/02/18(土) 22:17:02
えっと、番兵法や二分探索の問題です 問題1 2桁で入力された1つのくじ番号が、用意された10個の当選番号のどれかに 該当しているかどうかを判定するプログラムを作成しなさい 番兵法や、二分探索法を使ってもかまわない。 当選番号は{00.11.22.33.4.55.66.77.88.99.}です こちらの問題の解答をどなたかおねがいします ソースを書いてくれるとうれしいです。
>>413 マルチ乙。
自分でやらない奴がプログラマきどってんじゃねーよ
>>410 つ -Wwrite-strings
たまには-Wall以外の警告オプションもつけてみよう。たまには、ね。
俺はこれと-Wcast-qualはつけることの方が多いが。
417 :
デフォルトの名無しさん :2006/02/19(日) 01:21:08
-Wcast-qualはちゃんと気をつけて書いてても 達成できないことの方が多いから不便過ぎる。 特にfree(void *)の引数にconst char *を castで渡せなくなるのは辛い。
>>417 どんな書き方をすればそんなことをしなければならなくなるのかと
ちなみに curses 使うと char* に文字列リテラルを渡すことがよくあるから両方のオプションをつけると結構困る
該当外の話だったらすいません。 コマンドプロンプトからプログラムを結合させる、というのが条件の宿題をやっていたのですが 結合時に「エラー E2133: コマンド "ilink32.exe"を実行出来ない」とメッセージが出てできません。 どうすれば直るのでしょうか? 他にメッセージとしてはfscanfの際データ数を読み取る変数をまったく使っていないため 「警告W8004 "変数名"に代入された値は」使われていない」だけです。 使用コンパイラはborland bcc32です。お願いします
>>418 俺が想像するにこんな感じではないだろうか。
const char *f(void)
{
char *p = malloc();
if (p)
{
//ここでpにあれこれ書き込む。
}
return p;
}
俺だったら構造体(の不完全型)で隠蔽して必要な処理を関数にして提供するなあ 破棄もそれらを提供するモジュールの中でやる # 効率を重視する場合は別だが
422 :
417 :2006/02/19(日) 03:58:45
たとえばこんな感じの場面で(細かい処理は省略) コレは構造体のメンバの型をnon-constにすべきなの? struct mystruct { const char *name; /* 名前は変更不可 */ int value; } struct mystruct *mystruct_new(const char *name, int value) { struct mystruct *obj; obj = malloc(sizeof *obj); obj->name = strdup(name); obj->value = value; return obj; } void mystruct_free(struct mystruct *obj) { free((char *)obj->name); /* ここでcastしないと警告 */ free(obj); }
>422 Cだからな。 Cでそこら辺を美しさのためにいろいろ頑張るぐらいなら素直にC++使えって感じ?
>>422 俺はnon-constにする。変更されて困るなら公開しなきゃいいだけだし
425 :
デフォルトの名無しさん :2006/02/19(日) 08:33:29
プッ
426 :
419 :2006/02/19(日) 10:49:10
borlandスレがあったことに今気づきました。 スレ汚しすみませんでした。
427 :
デフォルトの名無しさん :2006/02/19(日) 13:30:31
scanf関数はあまり使わない方がいいと言われていますが、 これを使わないで安全に仕上げるには何を使ったらよろしいですか? よくfgetc、sやsscanf、atoi。等で代用されてる物を見ますが他に 安全な関数は何かを教えて頂けませんか?お願いします。
>>427 まず、一体何をやりたいんだ?
scanf が何故危険なのか判っているのか?
なんでも単純に「これは安全、これは危険」というように
切り分けられると思ったら大間違い。
プログラミングのみではなく、全てにいえる事だが、
個々の要件の状況と、その関数の挙動を把握した上で
「この場合では、この関数を使うとこういう問題が発生するから
使うべきではない」という風に判断するべきだろ?
一応標準規格外(M$仕様)ならばscanf_sというのがCRTに存在しているけど 標準の範囲内ならばscanfはfgets+sscanfで代用するのがふつう。
>>428 そこまでは把握してませんでした。おっしゃる通りです。
もう一度ライブラリの観察に行って理解してきますorz
>>429 規格とかの話には全くついて行けないです。
ですがscanfはfgets+sscanfで代用の辺りを扱えるように勉強します。
答えてくださり有難う御座います。
431 :
デフォルトの名無しさん :2006/02/19(日) 14:27:25
正直、キチガイじみた宣言の読み方がいつまでたっても分かりません・・・ ・・・おまえら、完璧に読めますか?
>>431 具体的に何が基地外じみてる?typedefとかか?
ポインタとカッコが混ざると、あれは演算子の優先順位が決まって
いる以上、複雑怪奇に見えても仕方ない。
atoiとかitoaとかワカメワカメ。
int atoi(const char *s); char *itoa(int value, char *string, int radix); (但しitoaは標準関数ではない) どこが難しいのかと・・・・
ちゃんと「読み方」って書いてあるのに・・・
>>435 だから分からないのはお前だけだって。勉強しなおせ。
だから文意を読み取れないのは
他人に正しく理解して欲しければ、正しい日本語の使い方から まず覚えまちょーね。
すげー、入れ食いだw
馬鹿ばっか。
kwsk
ここはバカの無限ループスレ?
444 :
デフォルトの名無しさん :2006/02/19(日) 16:11:34
教わるほうはともかく、教えるほうはもちっとしっかりするように。
何ここ。結局、宣言の読み方を教えろって厨が来てるわけか。 そんなもん、本読めよ。基本中の基本だぞ。
テンプレだな
447 :
デフォルトの名無しさん :2006/02/19(日) 16:40:26
strlen関数を使わずに自分で作った関数で、 文字列の長さを確認することは可能でしょうか?
449 :
デフォルトの名無しさん :2006/02/19(日) 16:43:48
L
450 :
デフォルトの名無しさん :2006/02/19(日) 16:44:26
size_t __cdecl strlen ( const char * str ) { const char *eos = str; while( *eos++ ) ; return( (int)(eos - str - 1) ); }
#include <string.h> #include <stdio.h> int sl(const char* s){ return strcspn(s,"\0"); } しらんがな
int Baka(const char *unko){int count=0;while(*unko++)count++;return count;} int Baka(const char *unko){int cnt=0;for(cnt=0;cnt <= sizeof(unko);cnt++);return cnt;} 俺天才
455 :
デフォルトの名無しさん :2006/02/19(日) 17:09:06
#include<stdio.h> int strlength(char*); main(){ char *a; printf("文字列を入力してください:"); gets(a); printf("文字列の長さは%dです。\n",strlength(a)); } int strlength(char *a){ int i; for(i=0;a[i]!="\0";i++){} return i; } 度ー駄目でっか(?_?)
size_t MyStrLen( const char * p) { return * p?MyStrLen( ++ p )+1:0; }
>>455 用意した文字列にナル文字が無い場合はエラー。
458 :
デフォルトの名無しさん :2006/02/19(日) 17:21:20
459 :
455 :2006/02/19(日) 17:26:35
'\0'したらできました。 失礼しまつた。
460 :
デフォルトの名無しさん :2006/02/19(日) 17:44:38
- for(i=0;a[i]!="\0";i++){} + for(i=0;a[i]!="\0"[0];i++){}
>>460 余りに無意味。""[0]でいいじゃんw
462 :
デフォルトの名無しさん :2006/02/19(日) 18:19:12
>>455 これがダメだな。
for(i=0;a[i]!="\0";i++){}
a[i] != "\0" ではない。a[i] != '\0' だ。
はぁ、クドい性格
俺ならこうする。 int i = 0; while(a[i]) i++;
467 :
デフォルトの名無しさん :2006/02/19(日) 19:04:01
俺ならこうだ! size_t strlength(const char *p) { size_t n = 0; while (*p++) n++; return n; } ていうか素直に strlen() 使うな・・・。
468 :
デフォルトの名無しさん :2006/02/19(日) 19:05:58
建前用ソースと 本番用ソースに分ける
int Baka(const char *unko)
{
int cnt=0;
for(cnt=0;cnt <= sizeof(unko);cnt++);
return cnt;
}
これはだめなの?
>>467 とかだとポインタとしてもらった場合
永遠にループするんじゃないんですか?
しまった〜〜sizeofは型のバイト数だった=〜〜〜〜〜俺死ぬは
後は、前提を無視して #define mystrlen(x) strlen(x) とか
inline size_t mystrlen(const char *s) { return (size_t)(strchr(s, '\0') - s); }
int Strlen( const char *s ) { char *buf=strdup( s ); int result = sprintf( buf, "%s", s ); free( buf ); return result; }
すみません。 mainの変数を別の関数で代入したいんですが、 グローバルにするか戻り値で返すしか方法はないんでしょうか? ただコードが長いので関数別に分けたいのですが、 変数が多すぎて対処できないです><
476 :
デフォルトの名無しさん :2006/02/19(日) 20:33:34
>>474 >変数が多すぎて対処できないです><
変数を用途別に分類して構造体にするといい
>475-476 ありがとうございます! 解決しました。
abc は unsigned long型の変数 p は ポインタ変数 としてみてください。 キャスティングに関する質問なのですが p=(unsigned char *)abc; 上の文はどのように動作するのでしょうか。 adをunsigned char型としてpに入れるということでしょうか。 それともadを無理やりpに入れた上、そのpのadが指し示すメモリの中身の値がunsigned char型ということでしょうか。
>>478 unsigned long型の変数をunsigned char *と見なして
評価した値がpに突っ込まれる
つまりそれが運良く、unsigned charの領域を指してる
場合もあるだろうが、通常は全く関係ない領域を指す事になる
つーか、んなコーディングは止めろ
480 :
デフォルトの名無しさん :2006/02/20(月) 07:19:20
>>479 ありがとうございます。
学校の課題で出されたプログラムでして、ここだけがどうも理解できなかったのです。
ちょ・・・・じゃんけんゲームができないよ・・・・・・・・。 配列の操作を詳しく解説しているサイトを教えてください。
>>481 じゃんけんゲームなら配列は要らないと思うのだが。どうして配列が必要なんだ?
1/3の確率でグーチョキパーが出ればいいだけだろ?
>>478 これはコンパイラやCPUによって違うことだが、 char *p; と宣言された
p は sizeof(p) で調べると4だったりする(これは sizeof(char *) が4と
いうのと同じこと)。で、sizeof(unsigned long) も4だったりする。すると
char * と unsigned long 型のそれぞれの変数は代入しても内容が失われ
ない(絶対失われないという保証はないかも知れないが、たいていの環境で
これができるようだ)。
コンパイラやCPUによって違うというのは sizeof(unsigned long) と
sizeof(char *) が違う値の場合があるからだ。なのでポインタ型以外
からキャストしてポインタとして代入するコードはどうしても必要な
時以外は書かない方がいい。書くとしてもビット数を意識して書か
ないと他の環境との互換性がなくなる。
>>482 猫でも分かるみたいに仮想のボードを作りたいです。
123
A
B
C
という感じにです。
charと2バイト文字の扱いがまだ全然理解出来ていないのと、
2次元配列も全くですね。
コンパイルできるのに表示されなし対処できないので勉強したいんですが。
有名な解説サイトとかがありましたら教えて頂きたいです。
無さそうですので自分で探す事にします。すいませんでした。
>>486 2次元配列についてだけ簡単に書いておいてあげよう。
まず、C言語には2次元配列というものはない。(がーん)
なので1次元の配列を1次元の配列の要素に入れる形で2次元を実現する。
char a[10][20]; と書いた場合、 char 型で20要素のある配列を10要素
宣言したことになる。(これ以上の多次元配列も考え方は同じ)
>>485 もう一度そのようなスレを探して見ます。
>>486 という事は計20*10で200要素ですよね。もっと詳しくあるような
感じですのでやっぱりサイト探しを続けます。
こういう誰でも知ってるようなことを得意顔で言う香具師ってまだいたのね ホントレベル低いなここw
>>486 2次元配列がないというのは間違い
おまえが言ってるのが *規格で定められた* 2次元配列の定義だ
C言語なら俺に聞け!
規格規格いう奴は、頼むからISO/IEC 9899:1999の何ページの 何行に書いてあるかまで書いてくれないか。 どこまで本当の事を言っているのかわからん。
JIS X3010-1993はダメか? あと、C99は高級アセンブラとしてのCを破壊したエセ規格と言っておく
>>493 それがさ、このスレにはJIS X3010:2003でないとダメだと言い張る
馬鹿がいんのよ。
C99に準拠したコンパイラがほんの少ししかないにもかかわらず、
「最新の規格だ」という理由だけで。
495 :
奈々@スーパープログラマ ◆Xl6OTFSLJ2 :2006/02/20(月) 15:49:25
2次元配列のアドレスの渡し方が分かりません。 例えば、 int hage[10][20]; と宣言した変数のアドレスを関数に渡して 関数内で *x[4][5] みたいな感じで扱いたいのですが、 上手くいきません。 関数の()内での宣言のしかたも、渡し方も分かりません。 void kansu(int**); としても上手くいきません。 渡すときも、 kansu(&&hage); とかやってみたのですが上手くいきません。 どうすれば思い通りにいきますでしょうか?
コマンドライン上に書き込まれた文字を読み取っていって(文字列の例:12df3) それぞれの文字ごとに処理を行いたいのです。 char ch; while((ch=getchar())!=***){ /* 処理 */ } ***にどんなものを入れればいいのですか? そもそもこのwhileの使い方でこのような処理は可能ですか?
>>495 うまくいかない、だけじゃあわからん
どう書いたらどういうエラーが出たのか書いてよ
>>496 #include <stdio.h> して EOF
コマンドラインとか言うと引数みたいだぞ
>>495 C-FAQ 6.18を256回読め
>>496 ダメ
×:char ch;
○:int ch;
while((ch=getchar())!=EOF) {
/* 処理 */
}
なら多分期待通りの処理になる
奈々がスーパープログラマなら俺はミラクルを起こせそうだ。
>>497 ,
>>449 ありがとうございます。
とりあえず無理みたいですね。
C-FAQを見ても二次元配列の、二次元目(?)の大きさは渡さなければならないみたいですし。
それを宣言の時点でしなければならないのがネックです。
2次元配列の中の1つの要素を渡したいだけならその要素の 型で渡せばいいだけだと思うが。何をしたいんだ? int a[10][20]; ならば func(a[5][2]); という感じで渡せる。 受ける方は int func(int n); のような感じでできる。
ファイルロックのテストをしてるんですが、 1万ループの内側でfopenを使って読み出してはカウントアップして書き出しています。 これを2プロセスで実行させると以下のエラーが出てしまいます。 kern.maxfiles limit exceeded by uid 1001, please see tuning(7). このエラー自体はチューニングすればいいのですが、まったく同じことをPerlで やったらエラーが出ずにうまくいきます。これはどういった違いなんでしょうか? fopenで開いたファイルは完全に後始末されていないということでしょうか?
char *http_ans = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"\ "<html>\r\n<p>html文書</p>\r\n<body>\r\n<form method="get" action="next.html">\r\n\r\n</body>\r\n</html>"; syntax error before "get"のエラーが出ます。 どこがまずいんでしょうか?
507 :
デフォルトの名無しさん :2006/02/20(月) 17:29:28
>>506 > "<html>\r\n<p>html文書</p>\r\n<body>\r\n<form method="get" action="next.html">\r\n\r\n</body>\r\n</html>"
× "get"
○ \"get\"
508 :
506 :2006/02/20(月) 17:36:56
>>505 fclose() してない、などというオチは許さない。
510 :
506 :2006/02/20(月) 17:50:22
すみません 文字コードの問題で、「 " 」 → 「 \" 」 という理解でいいでしょうか? あと、こういう知識はどうやって得るものなのでしょうか?
512 :
デフォルトの名無しさん :2006/02/20(月) 18:08:27
#include<stdio.h> void inputarray(int*,int); main(){ int i=5,c; int *p; inputarray(p,i); printf("入力された値:"); for(c=0;c<i;c++){ printf("%d",p[c]); } } void inputarray(int *p,int i){ int c; printf("%d個の整数を入力してください:\n",i); for(c=0;c<i;c++){ scanf("%d",p[c]); } return; どう間違ってるかわかる方いますか? 教えていただきたいのですが・・・。
>>512 ポインタを理解していないこと
ポインタが指し示す先には実体が存在しなければならない。
514 :
デフォルトの名無しさん :2006/02/20(月) 18:24:18
>>510 むしろ、「\r」、「\n」は理解しているのに、
「\"」を理解していない方が不思議だ。
>>512 とりあえず、
int *p; を int p[5]; に
scanf("%d",p[c]); を scanf("%d",&p[c]);
にしてみ。
細かいことは指摘しないが。
516 :
512 :2006/02/20(月) 18:51:17
可変数引数を実装した関数を作ったんだが 整数などはうまく取り出せたが文字列がうまくいきません。 とりあえずもう少し調べてきます。
>>518 >とりあえずもう少し調べてきます。
久々のクリーンヒット
>>511 ありがとうございます!
>>514 いや〜、どうしてでしょうね
でもぐぐってみたら確かに読んだことのある知識でした。
NULL文字以外使ったことなかったですw
>>493 JIS X3010:2003でないとダメだ。
「最新の規格だ」という理由で。
ああ、技ポイント0でスタンさせるんだろ
>>493 JIS X3010-1993は既に廃止されていて規格でも何でもないんだが。
規格の話をするならC99が唯一の規格なんだからそれに従わなきゃだめだろう。
実際にプログラムを組む場合とは話が違う。
>>525 廃止じゃなく改正だがな。
無論旧規格にはもはや有効期限は存在しない。
fopen( ,"+r") で開くとなぜかエラーが出てしまうのですがなぜなんでしょうか。 fopen( ,"r") だと何も問題はなかったのですが。
URL読んでどうするんだろう・・・
えいちてぃーてぃーぴぃころんすらっしゅすらっしゅだぶりゅだぶりゅだぶりゅぅどっとりなっくすどっとおーあーるどっとじぇぃぴぃすらっしゅ・・・
舌を噛んで氏ねという事ではないか?
URLを16回読んだらfopen()のオプションが完璧にわかりますた
すげぇ神のURLだなwwwwwwwww
534 :
デフォルトの名無しさん :2006/02/21(火) 18:44:57
i = *p; と i = p; が区別できないアフォがいるようだな
Cスレでポインタの区別が付かないのは恥ずかしいな *URLを読めで良いのか?
Javaにもポインタはあるけどな a == bとa.equals(b)の違いがわからない奴はJava厨にも値しない
VBにもあるし、暗黙に使ってることを考えればフォン・ノイマン型アーキテクチャのコンピュータ上のプログラムは全て使ってるな
539 :
デフォルトの名無しさん :2006/02/21(火) 20:37:05
>暗黙に使ってることを考えれば でた、何とでも使い回せる免罪符
ところで518よ。わかったのか?
たーらこーたーらこーたーっぷりーたーらこー
ソートの勉強してて、挿入ソートのコード書いたはいいんだけど10個もエラー出やがった。 エラーメッセージは C:\c_code\Sort\insert_sort\insert_sort.cpp(23) : error C2143: 構文エラー : ']' が ';' の前に必要です。 C:\c_code\Sort\insert_sort\insert_sort.cpp(23) : error C2143: 構文エラー : ';' が ']' の前に必要です。 C:\c_code\Sort\insert_sort\insert_sort.cpp(23) : error C2143: 構文エラー : ';' が '{' の前に必要です。 C:\c_code\Sort\insert_sort\insert_sort.cpp(23) : error C2143: 構文エラー : ';' が '}' の前に必要です。 C:\c_code\Sort\insert_sort\insert_sort.cpp(25) : error C2143: 構文エラー : ')' が ';' の前に必要です。 C:\c_code\Sort\insert_sort\insert_sort.cpp(25) : error C2059: 構文エラー : ')' C:\c_code\Sort\insert_sort\insert_sort.cpp(26) : error C2146: 構文エラー : ')' が、識別子 'i' の前に必要です。 C:\c_code\Sort\insert_sort\insert_sort.cpp(26) : error C2059: 構文エラー : ';' C:\c_code\Sort\insert_sort\insert_sort.cpp(26) : error C2059: 構文エラー : ')' C:\c_code\Sort\insert_sort\insert_sort.cpp(26) : error C2143: 構文エラー : ';' が '{' の前に必要です。 ソースは間違ってないと思うんだけどな。でも間違ってるからエラー出るんだよな。 30分にらめっこしたけど分からん。どこが間違ってるか指摘してくれ。
543 :
デフォルトの名無しさん :2006/02/21(火) 23:47:02
そーす #include <stdio.h> #define N 8; void insert_sort(int d[], int top, int end){ int i,j,tmp; for(i = top + 1; i <= end; i++){ tmp = d[i]; for(j = i - 1; j >= top; j--){ if(d[j] > tmp) d[j+1] = d[j]; else break; } d[j+1] = tmp; } } void main(){ int i; int d[N] = {10,20,40,70,60,80,30,50}; insert_sort(d, 0, N-1); for(i = 0; i < N; i++){ printf("%d ",d[i]); } printf("\n"); }
545 :
デフォルトの名無しさん :2006/02/21(火) 23:56:28
>>543 #define N 8;
が
#define N 8
#define N 8 お話にならん
確かに話しにならんな thx
23行目から上の部分、プリプロセッサで#defineを展開すると理解できるかもしれないね
549 :
デフォルトの名無しさん :2006/02/22(水) 00:07:57
strcpy()とsqrt()とmalloc()とprintf()を実装せよ。Linux上で。 もちろん元々実装されている機能(mallocとかreallocとかfprintfとか)を利用してはならない。 C言語で書かなくてもよい。 面接試験で合格したら今までのレポート点が0点でもOK。 この課題をこなしたい。strcpyとsqrtは簡単だったが残りって難しいよね? 解答か勉強するためのインデックスを教えとくれ。
氏ね
FreeのOSのソースを嫁
552 :
549 :2006/02/22(水) 00:18:40
やっぱりCPUの命令セットやOSの入出力部分を知らないと書けないのかな? Cの知識とアセンブラの初歩だけでどうにかなるようなら非常に嬉しいんだけど。
だから FreeのOSのソースを嫁ってんだろ。
554 :
549 :2006/02/22(水) 00:24:41
>>553 OSじゃなくて基本ライブラリのソースだよね?
意味のない分類をするな。
556 :
549 :2006/02/22(水) 00:28:43
意味のないってどういうことですか? OSとは違うでしょ
じゃぁ聞くが、基本ライブラリって何ですか?
558 :
549 :2006/02/22(水) 00:30:04
質問を質問で返さないでください!
559 :
549 :2006/02/22(水) 00:30:12
なんかオレの偽物が頑張ってる…
560 :
デフォルトの名無しさん :2006/02/22(水) 00:30:52
採点者がみつけられないようなマイナーなCライブラリを 漁ってきてコピペすればよかろ
561 :
549 :2006/02/22(水) 00:30:53
俺!俺!俺が本物だよ!><
OSって言うからダメなんだよ。 範囲が広くてあいまい過ぎるっしょ。 カーネルって言えば話が通じるんじゃね?
563 :
549 :2006/02/22(水) 00:34:09
サンダース?
564 :
549 :2006/02/22(水) 00:36:00
ケンタッキー?
>>549 落ち着いて息を整えて「ゲム・ギル・ガン・ゴー・グフォ」と唱えるんだ
>549の本物です(=>559)。 >560 面接試験なのでそれは無理。 >562 「カーネル」だとオレのスキルじゃつらいな… 「glibcの○○.asmを熟読汁」とか「カーネルソースの○○.cを嫁」だと頑張ればどうにかなりそうな気がするけど。 >565 7回唱えた。でもダメだった。
malloc なんて、適当に大きなメモリ持っといて、 そこから切り出して返しゃええやん。 printf も実装が面倒なだけで、難しい訳じゃない。
mallocをnew使ってやってみるとか 無理かな
>>567 printfの書式網羅以外の部分だけでも教えて頂けると嬉しかったりする。
>>568 >適当に大きなメモリ持っといて、
このやり方がわからないんです。
もちろんデカい配列を宣言しといて使いまわすってのはナシね。
>>569 そのやり方でOKなら書けるけど…。
たぶん「ダメ」って言われる。
これって相当難しい課題なんでしょうか?
最初は深く考えていなかったんだけど書き込みしているうちにそんな気がしてきた。
571 :
デフォルトの名無しさん :2006/02/22(水) 01:03:50
>>549 >strcpy, printf
これができないなら絶対に向かない仕事だ
>sqrt
開平わかんねーなら中学の先生にでも聞け
>malloc
NULL 返せりゃいいだけじゃん
自分のレベルに合わせればいいんじゃねーの? てかLinuxのmallocなんてソースが手に入るんじゃねーの? それ丸写しすりゃ完成ジャン。 既存のmallocとは異なる方法じゃなきゃならんのか?
>>571 strcpyは簡単だったけどprintfは今のところわかんない。
別に仕事でしてるわけじゃないよ。
sqrtは中学の授業じゃ無理です。
零点を求めるタイプのNewton法だから普通の実装なら少なくとも高校数学が要る。
>>malloc
>NULL 返せりゃいいだけじゃん
知ってるなら教えてよ。お願い。
普通のヤツじゃわからん。詳しい暇人が現れるのを待て。こういうことでFA?
>>573 ちょっとVCのprintf()を掘り下げてみたけど、
fprintf()とかの共通関数を作ってその中で文字列操作をゴリゴリやってるね
malloc()は本当にわからん
OS依存だろうが…
576 :
デフォルトの名無しさん :2006/02/22(水) 01:17:35
void *malloc() { return NULL; } ↑ 冗談抜きで、これを受け入れられないプログラムは strictly conforming program ではない
578 :
デフォルトの名無しさん :2006/02/22(水) 01:22:27
開発工数に1分以上かかったら減点だろうな
質問しているうちにだんだんと頭が整理できてきた。ような気がする。気のせいかもしれない。
申し訳ないけどそろそろ寝ます。
みなさんありがとう。
>>576 自信がつきました。Thx.
あるソースを見たら int i = NULL; ってあったけど、これってOKなの? コンパイラによっては、ワーニングが出たり出なかったりするけど。 ワーニングが出るときは、 たぶんNULLの値が(void *)0の値になっていて int i がポインタでないので型が一致していない・・・と推測しているのだが。
Cで浮動小数点演算のオーバーフローを、何とかして検出させることは出来ないでしょうか? 検索でアセンブリコードを混ぜるやり方が有りましたが、アセンブリは分からないものですから・・・ 何か妙案を賜れればと思います。宜しくお願いします。
void f(void){ int i; この関数での処理 } int main(void){ f(); その他の処理 } というようなプログラムがあったとします。 関数f()で取られたiなどのメモリは、関数f()が実行を終えて、 その他の処理に移ったら、解放されるものでしょうか? それとも、こちらで明示的に解放してあげなければならないのでしょうか?
質問してる奴のレベルが酷すぎ・・・いくらなんでも・・・
>582 そうです。明示的に開放してあげなければなりません。 よく気づきましたね。さすがです。
585 :
デフォルトの名無しさん :2006/02/22(水) 02:14:51
>>582 f()が実行を終えたら勝手に開放してくれる。
明示的に開放する手段はない。
質問です。
私の回答は合ってますか?
そもそも何を持って解放なのか・・・ 基本的にiはレジスタないしスタック領域に置かれると思います。 特にほっといてもいいのでは? >580 たぶん、その理由でいいんじゃないの? 間違っていたらすまん
587 :
デフォルトの名無しさん :2006/02/22(水) 03:04:16
_,,-―- 、__ _,,/;;;;;;ヾヾ 、,;;;;;;;;''ヽ_ ノ;_;,-―--''''゙゙ ̄ フ::::;;:'-、 // l、::::::: l、 (ヾ:::l |::::::、::、::::.ヽ, 、ノ:::::.| _,,、 ,、、__ |:::::::::::ゝ::::::> ゝ:::::::|''=・-`l ト'=・=ー` ヽ:::::::::::ゞ:::ゝ ヽ.| ` ー ,ヽ::,-;:::;;::/ | 、_,、,` l/6l::::ノ | ! , , l_ ノ:/ __| -'ー-ヽ / /`) ヽ | ,  ̄ __l_/,,-'=i______ __,,\`、_ ー-―' _//='''_-;;;;;;(( oo(( )) ;;;;;;;;;;○>\ ̄ ̄//○'.;;;;;;;;;;;;;;;;;;;;;;;;;;;|l |l |l |l |l ||
592 :
デフォルトの名無しさん :2006/02/22(水) 03:07:49
593 :
デフォルトの名無しさん :2006/02/22(水) 03:08:29
つfree((void*)f);
頼む教えてくれ。 256のデータが入力されている配列Aからある間隔でデータを 別の配列Bに同じデータを16個づつ入力していくプログラムを組みたいんだけどどうしたらいい? 配列Bには 0*16 5*16 10*16 ・・・ のようにしたいんだけど。 2重for文でできるようなんだがfor文とか配列の理解がなくて。。。
意味不明 for(i=0;i<256;i++)B[i]=A[i*16];
意味不明 #define REPEAT 16 #define PITCH 5 int array_a[256], array_b[256]; int iSrc, iDest, repeat = REPEAT; for (iSrc = iDest = 0; iDest < 256; iDest++){ array_b[iDest] = array_a[iSrc]; if (!--repeat){ repeat = REPEAT; iSrc += PITCH; } }
伝わりにくくてすまん。 例えばAの配列には0〜255の数値が入っていて Bの配列に0,63,127,191,255番目の数値を16個連続で入力させたい。 配列Bの中身が 00000000000000006363636363636363636363・・・ のような感じ。
599 :
デフォルトの名無しさん :2006/02/22(水) 10:32:02
は?
見たか!俺は600! 俺は至高!俺は吉良上野介! 俺は吟遊詩人!俺はホス○タル騎士団 俺はシャン○リ○通りの達人!俺はラザ○エフ商会 俺はサ○ルトリアの王子!俺は星の王子様! 俺は
#include <stdio.h> int main(void){ int A[256],B[256]; int i,j; for(i=0;i<256;i++)A[i]=i;/*A[]の初期化*/ for(i=0;i<256;i+=16)for(j=0;j<16;j++)B[i+j]=A[i];/*B[]*/ for(i=0;i<256;i++)printf("%d%s",B[i],(i+1)%16?" ":"\n"); } こんなんでいいの?
602 :
デフォルトの名無しさん :2006/02/22(水) 10:46:53
int main(int argc, char **argv) { } ↑これが一般的だと思っていたのですが、 たまーに↓みたいなのを見るんですが、 べつにOKなのですか?(戻り値intの後の改行じゃなくて、引数とその型宣言) あと、見た目以外でどういった違いがあるのでしょうか? int main(argc, argv) int argc; char **argv; { }
>>602 上はANSI C世代の書式
下はK&R以前のC
現状で下を使う必要性は皆無
以前あった、「XXは何の意味があるのでしょうか」の続編か・・・
即レスサンクス そうですか。なんか下の書き方のほうがカッコイイなぁーと思ったんだけど そうですか、、、
printf("質問します。\n"); error("いやです。\n"); 上のようなerror関数の仕様を教えてください。 ferrorとperrorは検索に引っかかるのですが・・・。
敢えて違いを挙げるならプロトタイプによる 実引数と仮引数の不一致検出ができるかとか 型の格上げが行われるかどうかとかがあるがな 細かいことはエキスパートCプログラミング嫁
>>549 printf()ってputc()も使えないのか?
malloc()はsbrk()が使えないと厳しいな
>>598 =595
頼むから日本語で質問してくれ。
配列の2バイト文字の扱いがよく分かりません。 char array[8] = "よんもじ"; とすると、array[0]とarray[1]で"よ"になるんですか?
>>610 文字コードによっては0と1と2と3で"よ"になります
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
int main(void)
{
char array[] = "よんもじ";
wchar_t array2[5];
setlocale(LC_ALL, "");
mbstowcs(array2, array, 5);
putwchar(array2[0]);
return 0;
}
とやれば確実。あんまりやってるの見たことないけど
>>610 エンコードによって違う。
utf8 だと日本語で使う文字は1文字3バイトだ。
サロゲートされている文字を含めば6バイト。
>>610 char array[9] にしないと、あとから悩むことになる。
615 :
612 :2006/02/22(水) 13:23:32
>>612 wchar_t array2[] = L"よんもじ";
マルチバイト文字列といえば、 リトル/ビッグエンディアンの別やマルチバイト⇔シングルバイトのシーケンスの変更のための表現とか色々あるな 一筋縄ではいかないからかなり限定された部分について勉強していくがいい
619 :
610 :2006/02/22(水) 14:03:16
みなさんありがとうございます! もう少し2バイト文字について勉強してきます。 あ〜日本人に生まれていなければ…
620 :
616 :2006/02/22(水) 14:15:00
>>618 コンパイラによってはだろ? 確かに gcc は L"" が変だ。
新しいバージョンではちゃんと使えるのかも知れないが。
>>619 「2バイト」で収まるとは限らない。「複数バイト」だ。
ってもう見てないか…。
gcc 4.0.2 でやってみたら L"..." はできた。 但し setlocale() 忘れると fputws() とかで出力する時に '?' に化ける。
623 :
デフォルトの名無しさん :2006/02/22(水) 17:22:26
毛唐製のコンパイラですから
gccは昔からlocale周りとかそのへんがウンコ以下だからな
猿の島で使えるだけでも感謝しろ
626 :
デフォルトの名無しさん :2006/02/22(水) 18:51:42
「C言語の切り札」と「やさしいC」どっちがいいですか?
627 :
デフォルトの名無しさん :2006/02/22(水) 19:04:23
int main(void) って感じで本には書いてあったけど μITRONには void main(void) ってありました。間違ってるの?
別に間違っちゃいない。 処理系が ・int main(void) ・int main(int,char**) 以外のプロトタイプを持ったmainに対応するのは勝手 移植性はないけど。
char *print[] = {"春","夏","秋","冬"}; printf(print[0]); printf(print[1]); printf(print[2]); これだと表示されないんですが、何がいけませんか? *print[1]とやってもダメですし・・・教えて下さい。
>>631 何がどうダメなのかを日本語で説明する能力が圧倒的に足りない。
コンパイルエラーなのか、実行すると自分の予想していない結果になるのかを書け
>>631 printfなら、書式が第1引数では?
printf("%s",print[0]);
>>633 いや、問題ないだろ。
printf("hoge");とかって普通にやるだぉ
別に文字列であれば書式じゃなくたっていいよ
>>631 うちだと
春夏秋
と、普通に表示されるぞ。
VC++6.0 proだ。
何がいけませんか?ってこっちが聞きたいわ。
うちも表示されるな。 gcc 3.3.6
C2006ではフォーマット、改行なしのprint関数(実際はマクロ定義)が 標準関数に追加されたからそれが悪さしてるんだと思う。
640 :
631 :2006/02/22(水) 21:28:07
すいません。PCが強制終了していろいろ消えてしまい、放置した形になってしまいました。 申し訳ありません。 コンパイルエラーではないんですが、常にprint[3]のみが表示したり するのでおかしいと思い質問したんですが、形的には合っているそうなので 他の部分を確認して見たいと思います。 答えて頂き有難う御座いますm(__)m
ちょっとまってくれ
>>638 を詳しく説明してくれ
悪さしているかしていないかは問題ではありません。 >638の信ぴょう性は高いですから国政調査権を要求します。
何でああいう事実無根の話を持ち出すのかわからない
ひとつだけ確かなことはプラウガーが2ちゃんねらだったということだ。
>>629 int main(int argc, char *argv[], char *envp[])
おれの本にはこう書いてある
>>629 >>645 などのような話を続けるときりが無いから
このスレは標準Cだけということになっている。
可変長引数の関数をマクロを利用してコールしたのだが やはり文字列がうまくいかない。 使ってるコンパイラはC99に対応してないし。 あきらめて寝るか。
日記ウザス
C言語なら俺に聞け! とのことですが、誰に聞けばよろしいか?
650 :
デフォルトの名無しさん :2006/02/22(水) 23:02:33
俺俺
いや、俺俺
いえいえ、ここは私が
653 :
デフォルトの名無しさん :2006/02/22(水) 23:24:46
聞く相手は誰でもない、自分自身だ!!
654 :
たすけて〜 :2006/02/22(水) 23:36:52
関数内でポインタ配列を動的に作っているんですが 下のdatarrayのかっこを付ける意味がよく分らないです。 単に*datarray[i]ではダメみたいで。 ご教授下さい。 test(char ***datarray){ *datarray = (char**)malloc(Cnt * sizeof(char*)); (*datarray)[i]=(char*)malloc(strlen(str)); strcpy((*datarray)[i],str); ↑ここのdatarrayのかっこがわからない。 }
*(datarray[i]) になったら困るだろ? つ結合順位
656 :
デフォルトの名無しさん :2006/02/22(水) 23:42:38
C言語の動的スライス抽出システムを作ってみようと思うのですが 元プログラムから実行系列を得るためにはどのようなプログラムを組めばいいでしょうか? プログラムの流れをたどる方法が思いつきません。 どうか知恵をお貸しください。
処理分岐をノードとした多分木を作り、各ノードに通過フラグを持たせる。 実行プログラムの処理ごとにフラグをONしていき、最終的にノード情報を集めればよい。
658 :
デフォルトの名無しさん :2006/02/23(木) 00:57:40
引数の値によって処理の異なる関数を呼び出すことは出来ますか。 if文を使わずに計算コストを掛けないのがいいです。
でき
関数のポインタの配列やswitchじゃ不満なのかね
不満です
664 :
658 :2006/02/23(木) 01:03:06
やり方教えてください。 マクロを使って置き換えられないかと思ったのですが出来ませんでした。
sprintf(array,"%s%s",*array,"追加文字"); のような処理がしたいのですが、これだとarrayの同一アドレスを参照することにより エラーが発生するのだと思うのですが、このような追加処理をする関数ってありますか?
666 :
658 :2006/02/23(木) 01:05:18
#define fnc(x) f_x() x=1; fnc(1); x=2; fnc(2); みたいな感じで出来ませんかね?
667 :
訂正 :2006/02/23(木) 01:06:10
#define fnc(x) f_x() x=1; fnc(x); x=2; fnc(x); みたいな感じで出来ませんかね?
>>665 strcat(array,"追加文字");
でダメ?
670 :
デフォルトの名無しさん :2006/02/23(木) 01:10:59
>>669 662さんですか。
やり方教えてください。
671 :
665 :2006/02/23(木) 01:12:41
672 :
デフォルトの名無しさん :2006/02/23(木) 01:18:49
>>662 それってポリモルフィズムだかなんだかの概念ですよね?
結局型チェックしてそれに応じて関数呼び出すから
if文で使い分けするのとコスト変わらない気がするんですが。
673 :
658 :2006/02/23(木) 01:19:24
関数のポインタの配列で調べたらわかりました! ありがとうございました!
674 :
672 :2006/02/23(木) 01:20:37
あ、値か…
675 :
674 :2006/02/23(木) 01:23:27
あ、Cか…
ウザ・・・
677 :
デフォルトの名無しさん :2006/02/23(木) 02:06:04
関数呼び出しのオーパヘッドがかかってしまうのですがif文の方が速いですよね? 他に方法無いですか? int f1() { return 1; } int f2() { return 2; } int main(void) { int x=1; int (*fnc[2])(); fnc[0]=f1; fnc[1]=f2; (*fnc[x])(); }
何このくだらない質問スレ
>関数呼び出しのオーパヘッドがかかってしまう >if文の方が速い どんだけ厳しいリソースのプラットフォーム上でやってんだかw ちっちぇな
\\_ :三ニ=:::::::ヽ :ヽ.ニ=::て.>廴_ スルー 三.ヽ= (⌒ヽ;:;:;,.二) ニ=-ヽ:ヽ、,∠.^^ぅ 〃,べ= ̄ニ二 ̄ /;:ィリ ノノ ,.へヽ ;:ヘ/ ̄ ̄ ̄Vヽヽ ソ ├┤|
683 :
677 :2006/02/23(木) 02:26:11
処理の中で頻繁に用いる関数があり 引数の値が1から1000まで動いてそれに応じて 1000個の関数を呼び出すとすると... それを使うごとに最悪1000回比較しないといけませんよね。 いちどに呼び出せないですか?
>引数の値が1から1000まで動いてそれに応じて1000個の関数を呼び出す >それを使うごとに最悪1000回比較 なぜ? たかだか10回くらいじゃねの?比較
685 :
デフォルトの名無しさん :2006/02/23(木) 02:31:37
>>683 あんたさっき if 文のが速いとか言ってたよな? ヴァカ?
頭のおかしい人を相手にしてはいけません
687 :
デフォルトの名無しさん :2006/02/23(木) 02:35:35
>>683 >引数の値が1から1000まで動いてそれに応じて
>1000個の関数を呼び出すとすると...
その引数の値って具体的に何?
688 :
677 :2006/02/23(木) 02:36:05
半分づつ比較していってマクロか、インライン関数を呼び出すのが最善ですか?
689 :
デフォルトの名無しさん :2006/02/23(木) 02:40:16
1000個の関数ポインタからなる配列を用意すれば一発なんだが
1000個の関数という時点で何かおかしい。 データ構造を工夫すれば回避できるんでないの。 何がしたいんだ?
691 :
677 :2006/02/23(木) 02:42:56
関数ポインタだとインライン展開出来ないですよね。 それだと一つの関数内にif文使って処理をすべて書いてしまった方が速いですよね。
692 :
デフォルトの名無しさん :2006/02/23(木) 02:44:08
>>690 まったく同意
根本的なところで間違いがあるような気がする
693 :
677 :2006/02/23(木) 02:44:59
千個というのは例えなんです。実際は30から50位です。 将棋プログラムの指し手生成ルーチンの種類数なんです。
694 :
656 :2006/02/23(木) 02:47:39
>>657 すみません、自分の知識不足でよく理解できませんでした。
自分の不甲斐なさに絶望・・・。
>関数ポインタだとインライン展開出来ない なぜ淫乱てんかいする必要があるのか?
とりうる値が十分狭いならswitch/caseじゃ駄目なん? べたにif else if繰り返すよりは速い
700 :
677 :2006/02/23(木) 03:04:22
>>697 1<=a<=8だと...こんな感じ。比較3回で処理にたどり着く。
if(a<5){
if(a<3)if(a==1)f1(); else f2();
else if(a==3)f3(); else f4();
}
else {・・・}
なぜ一発でできる処理を出されてるのに馬鹿みたいな処理を考えるんだ
702 :
デフォルトの名無しさん :2006/02/23(木) 03:09:50
void (*func[30])(int arg1); (func+no)(arg1); これで一発。
703 :
677 :2006/02/23(木) 03:10:42
>>701 関数ポインタだとそのときに関数が確定してないからインライン展開出来ないし、マクロもできない。処理速度を速くしたいんですが。
704 :
デフォルトの名無しさん :2006/02/23(木) 03:11:53
>>703 どんな処理になればいいのかをアセンブラで書いてみてくれたほうが
みんなに伝わりやすそうだな
>>703 だからswitchは駄目かと出てるだろ馬鹿
706 :
677 :2006/02/23(木) 03:13:28
switchだと最悪1000回比較しなきゃならないから鈍いんですが。
妄想もここまできたら病院行きだな。
いちいち煽りいれるな。
712 :
デフォルトの名無しさん :2006/02/23(木) 03:19:37
>>706 switchはふつうジャンプテーブルを使っているよ
考え方は関数ポインタと同じ。関数コールでなくてJUMPするだけ
713 :
デフォルトの名無しさん :2006/02/23(木) 03:35:59
C言語ならホモに聞け
Delphiで function EncodeStr(Str:string;Mask:integer): string; var i: integer; begin for i := 1 to Length(Str) do Str[i] := Chr(Ord(Str[i]) xor Mask); Result := Str; end; というxorで文字列をなんちゃって暗号化したものを復元するものを C言語で書いています。 void Encode(char str[], int Mask, char *result) { unsigned char i; char array[100]; for (i=0; i <= 100; i++){ array[i] = str[i] ^ Mask; } result = array; } としたのですが、うまくいきません。 C言語の方のどこを変えればいいでしょうか?
716 :
デフォルトの名無しさん :2006/02/23(木) 07:05:45
自動変数は関数抜けると消える resultにアドレスいれたところで、関数抜けたら無効
717 :
656 :2006/02/23(木) 08:56:08
>>657 具体的にどのように記述すればいいのか
よければご教授お願いします。
教示じゃなくて教授?
ご教授するほどの答えをこんなとこで求めるなと
>>677 実測もせずに速度云々を語るな!
高速化の為の最初のアプローチは、
実測してボトルネックを見つける事だぞ?
>>714 1. Delphi の result は結果を入れるための特殊な変数。
2. Delphi の String 型に対応する C 言語の型は存在しない。
3. C言語に文字列型は存在しない。
4. C言語は文字列を扱う場合は char 型の配列で行う。
5. C言語は関数の中から配列を return で返すことは出来ない。
返せるのは数値の型と構造体とポインタ。
>>714 6. C言語は関数に値渡ししかできない。参照がない。(C++はある)
7. C言語は関数の引数で宣言した変数は呼び出された時に呼び出し
元の値で初期化されるが自動変数と同様に return 時に消滅する。
フーン・・・ 結構DelphiとCって違うのね
Cだと、こんなかんじ。 char *Encode(char *str, int Mask, char result[], int size) { unsigned char *p_str = (unsigned char*)str; unsigned char *p_res = (unsigned char*)result; unsigned char mask = (unsigned char)Mask; int i; for (i = 0; p_str[i] != '\0'; i++){ if( i >= size ){ /* オーバーフロー時の処理を入れる */ break; } p_res[i] = p_str[i] ^ mask; } return result; /* ワークバッファをそのまま返すと、 呼び出しもとで便利なことがある。*/ } /* 使う側 */ int main(){ char s[] = "あいうえおかきくけこ"; char result[256]; int Mask = 0x7f; Encode(s, Mask, result, sizeof(result)); /* 結果をそのまま表示できる。*/ puts(Encode(s, Mask, result, sizeof(result))); }
726 :
725 :2006/02/23(木) 11:46:08
この場合、マスクで文字コードを壊してるから、まともな文字が表示されることはないけどな。
727 :
725 :2006/02/23(木) 11:49:34
バグがあった。訂正。 char *Encode(char *str, int Mask, char result[], int size) { unsigned char *p_str = (unsigned char*)str; unsigned char *p_res = (unsigned char*)result; unsigned char mask = (unsigned char)Mask; int i; for (i = 0; p_str[i] != '\0'; i++){ if( i >= size ){ /* オーバーフロー時の処理を入れる */ i = size -1; /* これは一例 */ break; } p_res[i] = p_str[i] ^ mask; } result[i] = '\0'; /*文字列の終端コード*/ return result; /* ワークバッファをそのまま返すと、 呼び出しもとで便利なことがある。*/ }
処理速度を速くしたいならCなんて使うな アセンブラでも使え
関数テーブル使ってもどのみち高頻度でパイプライン・ストールするからな。 高速化の為よりもむしろ遷移をわかりやすく(このへんはコーディングポリシーにもよる)する目的で使うもの。
頭の固い奴だな、実測もせずに頭の中だけで完結して決め付け、周りを振り回す。 一番使えない奴だ・・・
実測実測要ってる厨房が一番頭悪そうだな。早く消えてくれないものか。
732 :
デフォルトの名無しさん :2006/02/23(木) 14:43:15
何をするにも成果の評価は必要不可欠
じゃ、CPUを脳内シミュレートして、処理時間を計算汁
プロファイリングもせずに最適化って、ただの馬鹿だろw
プロファイラ使えばいい話ではある
switch文でジャンプテーブル作ってもパイプラインストール率きわめて高いんだが。 なるべくならテーブル参照とビット演算でブランチレスに汁
737 :
714 :2006/02/23(木) 17:19:06
みなさん丁寧にありがとうございます!
>>727 さんの方法でできました。
このスレの方は親切ですね!
Delphiは配列をStingとして勝手にやってくれていたので、
C言語に挑戦してから戸惑いが多いです。
ほんとに助かりました、ありがとうございました。
だれか、パイプラインシミュレータ?見たいな物を知っていたら教えてください。 単純な処理ですが、単純ゆえに高速化したい関数があるのです。
その関数とは将棋プログラムの指し手生成ルーチンですか?
740 :
デフォルトの名無しさん :2006/02/23(木) 22:03:38
>>738 また将棋プログラムの指し手生成ルーチンかよw
プログラムの実行速度を上げるときには、
まず、プログラムのどの部分がどれだけ時間を食っているかを調査すること
当然だが、一番処理時間を食っているところを改善すると、全体のパフォーマンスがアップする
ところが、現実にはむやみやたらに性能アップを試みる輩がいる
全体の1%くらいのところを50%性能アップしたからといって、全体では0.5%しか
向上していない
そんなところはやってもやらなくても同じ
なんか見当違いなレスだな 何でボトルネックになってないって前提で話すんだよ
>>741 >何でボトルネックになってないって前提で話すんだよ
本当に将棋プログラムの指し手生成ルーチンの話ならば、
パイプライン周りを弄ることによって得られる高速化なんて、
高が知れているから。
そこら辺のルーチンを作っており、なおかつまともな思考能力を
持っている人間ならば、機種ごとに結果が異なってしまう
パイプラインなんかに頭を使うような無駄なことはしない
(勿論、全くしないわけではないけれど、比率は非常に低い。)
そんな不毛な部分ではなく、他の評価方法や枝狩りを考えていた方が
ずっと高速化されるから。
743 :
デフォルトの名無しさん :2006/02/23(木) 22:32:26
Windows プログラミング 第五版の 53ページで 配列が大域的であれば(つまり、関数の外で定義されていれば)、 文字配列は次のような文で初期化できる char a[] = "Hello!"; この配列を関数の局所変数として定義する場合には、 次のように static 変数として定義しなければならない。 static char a[] = "Hello!"; と書いてあるんですが、その理由は何ですか? ふつうにコンパイルも通るんですけど ローカルでは char a[] = "Hello!"; じゃ駄目なんですか?
>>743 どういう文脈なんだろ?
その文字列を、関数を抜けた後でも使うとか?
745 :
デフォルトの名無しさん :2006/02/23(木) 22:45:02
Unicode関連の話題で 文字と文字配列の定義と初期化の仕方を書いてるだけなんですけどね。
746 :
鱸鮭鱒鯔鯵鰈 ◆0RNR3g.MhY :2006/02/23(木) 22:51:00
質問です。 C++って、new しなかったら基本的にdeleteは無くても メモリリークしないんですか? 例えば、以下のような場合とか、メモリが開放されるのはいつですか? std:vector<string*> strList; for(int i=0; i<100; i++){ std::string str = "ああああ"; strList.push_back(&str); }
スタック変数はスコープの終わりで破棄される。 つまり、strはループ回るたびに毎回破棄されるから、 このポインタをpush_backしちゃだめ。 この場合vector<string>にするべし。
748 :
デフォルトの名無しさん :2006/02/23(木) 23:04:02
>>747 うほっ!
strListが開放されるときに開放されるかとオモタ・・・。
危なかった・・・。
ありがとうございますた!
749 :
デフォルトの名無しさん :2006/02/23(木) 23:09:20
750 :
デフォルトの名無しさん :2006/02/23(木) 23:40:41
2次元配列へのポインタと引数の質問です。 [関数] void savecsv(char fname[], char *tbl[][TBLSZ], int ln); 上記の関数への引数の受け渡しがうまくいきません。 [関数呼び出し側] savecsv(&name , tb ,num); 第二引数の実引数がおかしいのですが、呼び出し側の引数が解かる方おられますでしょうか? [エラー] C:\csv.c(108): warning C4047: '関数' : 間接参照のレベルが 'char *' と 'char **__w64 ' で異なっています。
nameってたぶんchar*型だろ? &nameをnameにしたら
>>750 >呼び出し側の引数が解かる方おられますでしょうか?
その質問は、2chで
「私の名前は何でしょうか?」と聞くのと
大して変わらないな。
753 :
デフォルトの名無しさん :2006/02/23(木) 23:47:46
すいません。エラーじゃなくて、警告でした。 第二引数char *tbl[][TBLSZ]への、実引数の型がわかりません。 char *tbl[][TBLSZ] こんな書き方を見たの初めてで。。
>>751 ありがとうー^^*
同じ文にあるchar *tbl[][TBLSZ] が絶対間違ってると思ってたから、
助かったっス。
>>743 その文脈では昔のコンパイラでは配列型のローカル変数を初期化できなかった
(グローバル変数と静的(== Staticな)変数)だけでしか配列の初期化はできなかった)
ためだと思う。
>>751 エスパー(というほどでもないか)乙
>>750 つぎはname, tb ,numの定義をちゃんと書いておくれな
リョーカイ
758 :
デフォルトの名無しさん :2006/02/23(木) 23:59:40
エスパー: 鈍くてウホな奴が普通の人を妬んで使う用語
GetCursorPos(&pt); TrackPopupMenu(hMenuP, TPM_LEFTALIGN, pt.x, pt.y, 0, hwnd, NULL); として、ポップアップメニューを出して、ポップアップメニュー以外の部分をクリックした時、 つまり、フォーカスが他に移った時に、ポップアップメニューを閉じる方法ってありますか?
760 :
デフォルトの名無しさん :2006/02/24(金) 00:25:25
スレ違い Win32スレで聞け
762 :
759 :2006/02/24(金) 00:27:36
すみません、失礼しました。
763 :
デフォルトの名無しさん :2006/02/24(金) 00:50:46
Cで作ったプログラムにバージョン情報やカンパニー情報を入れることってできますか? bccdeveloper使ってます。
765 :
デフォルトの名無しさん :2006/02/24(金) 01:22:20
>>764 ふつーに
fprintf(stderr, "Copyright(C)2006 Mona Corporation");
とかやれば?
OS によってはバイナリファイルの中に特別な埋め込み情報があったりもするけど
そういうのはそれぞれの環境スレで聞いた方がいい
リソースに入れたら?窓プログラムは 微妙にすれ違いな気がするけど。BCスレってなかったっけ?
767 :
デフォルトの名無しさん :2006/02/24(金) 01:26:30
768 :
デフォルトの名無しさん :2006/02/24(金) 04:29:34
昨日世話になったものだが... 関数ポインタ等の件で。 速度計ってみたのだが... 関数ポインタ >>>>> swich > if だったぞ。 データの範囲は0から15でifはループを使わない二分探索。 処理は代入だけ。 swichはifの三倍程度かかるのだが。
769 :
デフォルトの名無しさん :2006/02/24(金) 04:30:37
swichが一番速いという様な結論ではなかったのかよ。
770 :
ソース :2006/02/24(金) 04:45:35
#include "stdafx.h" #include <stdlib.h> #define N 10000000 int z,i;char a[N]; fnif(){ for(i=N-1;i>=0;i--){ if(a[i]<8){if(a[i]<4){ if(a[i]<2){if(a[i]==1)z=1;else z=0;} else {if(a[i]==3)z=3;else z=2;}} else{ if(a[i]<6){if(a[i]==5)z=5;else z=4;} else {if(a[i]==7)z=7;else z=6;}}} else{ if(a[i]<12){ if(a[i]<10){if(a[i]==9)z=9;else z=8;} else {if(a[i]==11)z=11;else z=10;}} else{ if(a[i]<14){if(a[i]==13)z=13;else z=12;} else {if(a[i]==15)z=15;else z=14;}}}}} fnsw(){ for(i=N-1;i>=0;i--){ switch(a[i]){ case 0:z=0;break;case 1:z=1;break;case 2:z=2;break; case 3:z=3;break;case 4:z=4;break;case 5:z=5;break; case 6:z=6;break;case 7:z=7;break;case 8:z=8;break; case 9:z=9;break;case 10:z=10;break;case 11:z=11;break; case 12:z=12;break;case 13:z=13;break;case 14:z=14;break; case 15:z=15;break;default:__assume(0);}}} int main(void){ for(i=0;i<N;i++)a[i]=rand()%16; fnif();fnsw();}
771 :
デフォルトの名無しさん :2006/02/24(金) 04:47:33
うぷの為にソースに手を加えたらswichの速度を13とすると ifの二分探索21になったぞ。どうなってる?
772 :
デフォルトの名無しさん :2006/02/24(金) 04:54:17
し〜ら〜ねぇ〜 てか何故に関数ポインタ?
773 :
デフォルトの名無しさん :2006/02/24(金) 04:56:50
772 関数ポインタを使えば比較を一度も使わずに分岐が出来るからだよ。
774 :
デフォルトの名無しさん :2006/02/24(金) 05:00:58
な〜る〜ほ〜ど〜・・・って情報系でも何でもないただの大学生がそんなことわかるかぁ (ノ ゚Д゚)ノ ==== ┻--┻
775 :
デフォルトの名無しさん :2006/02/24(金) 05:05:14
本当に別人だかどうだか・・・
俺には同一人物に見えるなw
778 :
デフォルトの名無しさん :2006/02/24(金) 05:27:48
779 :
デフォルトの名無しさん :2006/02/24(金) 05:37:01
知らない振りかもしれない・・・w
( ´Д`) 何でもいいが、とりあえず俺を休ませろ
休んでない振りかもしれない・・・w
>>770 switchは、分岐の数でテーブルジャンプになったりならなかったりするから、
もう少し増やしてみたら?
783 :
デフォルトの名無しさん :2006/02/24(金) 09:11:43
無駄な部分を最適化してるなあ・・・ って言っちゃダメなんだっけ?
if文がいやなのに、for 文の 2つめに比較式を書くのは気にならないんだな
fgetsについて質問です。 読み込むストリームで改行よりも先にNULL文字があっても改行までセットすることは ANSI-Cで保証されているんですか? fgetsはテキスト処理用で、freadばバイナリ処理用と一般に書かれてたりしますが、 gccで試したら一応、途中にあるNULL文字を含んだその後の改行までセットされていました。
保証されています
> fgetsはテキスト処理用で、freadばバイナリ処理用と一般に書かれてたりしますが、 そんなの読まないように。
それ以外にどう使い分けるんだ?
>>785 保証されていると思うが、何バイト読んだかが分からないので最後の位置が分からない。
不安なら getc() 使って自分で1バイトづつ読んでバッファに入れる関数を自作しろ。
それか環境依存してもいいなら GNU ライブラリにある getline() でも使え。
>>788 テキストかどうかとうよりは1レコードの長さが固定されているかどうか、だ。
ただ OS によっては fopen() 時のモードに b を付けないとうまく行かない。
いかにも2ch的に不毛な突込みだな・・・ しかも意味ねー
理論と実戦の狭間と言ったところか・・・
【理論ヲタ】 読み方: りろんおた 意味/解説: 理論ばかりを学んで実践をしない人間の総称。 他人のやること成すことに理論で文句をつけ、 その発展を阻害する存在。理論が先行してま ともなものは何一つ作れない真性厨房に多く 見られる。 類: 基地外厨房
794 :
770 :2006/02/24(金) 14:31:37
スイッチの方が速いな。 #include "stdafx.h" #include <stdlib.h> #include <time.h> #define N 10000000 int z,i;char a[N+1],x;clock_t c[2]; fnif(){ for(i=N-1;i>=0;i=i--){ if(a[i]<16)x=8; else x=24;if(a[i]<x)x=x-4; else x=x+4; if(a[i]<x)x=x-2; else x=x+2;if(a[i]<x)x=x-1; else x=x+1; if(a[i]==x)z=0; else z=1;}} fnsw(){ for(i=0;;i++){ switch(a[i]){ case 0:z=0;break;case 1:z=1;break;case 2:z=2;break;case 3:z=3;break; case 4:z=4;break;case 5:z=5;break;case 6:z=6;break;case 7:z=7;break; case 8:z=8;break;case 9:z=9;break;case 10:z=10;break;case 11:z=11;break; case 12:z=12;break;case 13:z=13;break;case 14:z=14;break;case 15:z=15;break; case 16:z=16;break;case 17:z=17;break;case 18:z=18;break;case 19:z=19;break; case 20:z=20;break;case 21:z=21;break;case 22:z=22;break;case 23:z=23;break; case 24:z=24;break;case 25:z=25;break;case 26:z=26;break;case 27:z=27;break; case 28:z=28;break;case 29:z=29;break;case 30:z=30;break;case 31:z=31;break; case 32:goto deru;}}deru:;} int main(void){ for(i=0;i<N;i++)a[i]=rand()%32;a[N]=32; c[0]=clock();fnif();c[1]=clock(); printf("ifで分岐に%d clockかかりました。\n" , c[1]-c[0]); c[0]=clock();fnsw();c[1]=clock(); printf("swichで分岐に%d clockかかりました。\n" , c[1]-c[0]);}
>>794 それ、z = a[i]; でいいんじゃ・・・。
>>793 いるいるwww
あと、文字コードヲタとC仕様ヲタもな
この手合いにはまともなものは作れないってのは共通
バイナリとテキストの違いがわかってないやつは、それ以上にまともなもん作れないだろ。
バイナリとテキストって分けてる奴が一番お疲れだ
教えてください! 底が2のlogの計算はどうやったらいいですか?(>_<)
テキスト⊆バイナリ
>>800 っ [対数の底の変換]
高校の数学の教科書読め
804 :
800 :2006/02/24(金) 16:21:32
ありがとう(>_<)
スタックが作れるようになったんですけど、これを応用したプログラムには 何があるのか教えてください。
>>806 すいませんでした。ありがとうございますm(__)m
必ずいるな。 テキストとバイナリの話題になると、文脈を無視して「区別はない」ってやつ。
人をラベリングする類いの話題になると 嬉々として湧いてくるタイプの人も必ず居ますね。
810 :
デフォルトの名無しさん :2006/02/24(金) 17:35:28
バイナリモードで開けば同じようなもんだw
0D 0Aってダサいよな
っ * 正直者には見えない不思議なコピペ さぁ 今すぐ嘘をついて他のスレに貼ってみよう!
世の中には10種類の人間がいる。二進法が分かる者と分からない者だ
つまり 2進法がわかる人間=10パターン それ以外=0パターン ということです
Cって同一ファイル内で変数の宣言より上の行にその変数を使うことってありますか?
,. -──- 、 「いや、そのしつもんはおかしい。」 / /⌒ i'⌒iヽ、 / ,.-'ゝ__,.・・_ノ-、ヽ i ‐'''ナ''ー-- ● =''''''リ _,....:-‐‐‐-.、 l -‐i''''~ニ-‐,.... !....、ー`ナ `r'=、-、、:::::::ヽr_ 「Cって同一ファイル内で変数の宣言より !. t´ r''"´、_,::、::::} ノ` ,.i'・ ,!_`,!::::::::::::ヽ 上の行にその変数を使うことってありますか?」 ゝゝ、,,ニ=====ニ/r'⌒; rー`ー' ,! リ::::::::::::ノ i`''''y--- (,iテ‐,'i~´ゝ''´  ̄ ̄ヽ` :::::::::::ノ | '、,............, i }'´ 、ー_',,...`::::ィ' ●、_!,ヽ-r⌒i-、ノ-''‐、 ゝ`ーt---''ヽ'''''''|`ーt-'つ ( `ーイ ゙i 丿 ;'-,' ,ノー''''{`' !゙ヽノ ,ヽ, `ー--' --'` ̄ `ー't,´`ヽ;;;、,,,,,,___,) ヽ'-゙'" (`ー':;;;;;;;;;;;;;;;ノ ``''''''``'''''´
>>797 「動けばいいんだろ」みたいな口ぶりのやつのほうが、
動くものを作れないだろ。
818 :
デフォルトの名無しさん :2006/02/24(金) 18:21:59
>>817 一番ヤバぃのは理論振りかざして何も出来ない木偶の坊だ
「動けばいいんだろ」なんて言って、とんでもないものを作ってしまう奴よりは何もできない奴の方がまだまし
と、何もできない人が申しております。
>>820 そもそもそういうのは「動かないもの」なのですが…
「動けばいい」という発想の元で作られたプログラムの デバッグをやらねばならない俺の身にもなってくれ。orz
>>823 っ 蛇の道をススム者の定めじゃ…o|ro|rz
825 :
815 :2006/02/24(金) 19:43:25
すみません誰か回答お願いします
良く分かりませんが、これ、置いておきますね つ extern
,. -──- 、 「いや、そのかいとうはおかしい。」 / /⌒ i'⌒iヽ、 / ,.-'ゝ__,.・・_ノ-、ヽ i ‐'''ナ''ー-- ● =''''''リ _,....:-‐‐‐-.、 l -‐i''''~ニ-‐,.... !....、ー`ナ `r'=、-、、:::::::ヽr_ 「良く分かりませんが、これ、置いておきますね !. t´ r''"´、_,::、::::} ノ` ,.i'・ ,!_`,!::::::::::::ヽ つ extern」 ゝゝ、,,ニ=====ニ/r'⌒; rー`ー' ,! リ::::::::::::ノ i`''''y--- (,iテ‐,'i~´ゝ''´  ̄ ̄ヽ` :::::::::::ノ | '、,............, i }'´ 、ー_',,...`::::ィ' ●、_!,ヽ-r⌒i-、ノ-''‐、 ゝ`ーt---''ヽ'''''''|`ーt-'つ ( `ーイ ゙i 丿 ;'-,' ,ノー''''{`' !゙ヽノ ,ヽ, `ー--' --'` ̄ `ー't,´`ヽ;;;、,,,,,,___,) ヽ'-゙'" (`ー':;;;;;;;;;;;;;;;ノ ``''''''``'''''´
どちらも申し分ない無能だが、
>>826 はその一歩先にいるなw
一つ上の立場からモノを言えば、無能じゃないと思ってる無能も一人。
つ C99
831 :
デフォルトの名無しさん :2006/02/24(金) 21:20:52
C99はこのスレでは存在しない物になっています
不用意にC99という言葉を使うと規格ヲタとしてラベリングされます
世間的にもないことになってます。
C99の扱いヒドスwwwwwwwww
C99とかほざくくらいならC++使います
C++とかほざくくらいなら C++使います ++
837 :
815 :2006/02/24(金) 22:18:38
結局どうなんでしょうか?
>>837 やってみれば判ると思いますが、どこか前方で同じ名前の変数を宣言していない限り使えません。
840 :
デフォルトの名無しさん :2006/02/24(金) 23:23:24
動けばいいという発想のもとで作られた、セキュリティ ホールだらけ、競合条件だらけ、バグだらけのプログラムを 見ても作った人に言ってはいけませんよ。 心の中で「こいつレベル低いなあ…」と見下しながら笑顔で 付き合うのが大人です。
842 :
838 :2006/02/24(金) 23:31:39
。・゚・(ノД`)・゚・。
843 :
デフォルトの名無しさん :2006/02/25(土) 00:35:38
>837 やってみろアホ
844 :
815 :2006/02/25(土) 01:48:02
いや普通に流れてたらないってのは分かっていて 何か特殊というか見落としたりしてないかと思ったわけで だからやってみるってことはできないわけで
日本語でおk
>>844 日本語でどうぞ。
或いは、検索機能のついたエディタか検索ツールを使えば済むことなのでしょうか。
847 :
デフォルトの名無しさん :2006/02/25(土) 03:29:17
お願いします。 ポインタについてなんですが int *pt1=&a; と宣言した場合というのは int *pt1; pt1=&a; ということと同じことなのでしょうか?
なぜ同じと思うのか、なぜ違うと思うのか
constでもつけて試してみたら?
850 :
デフォルトの名無しさん :2006/02/25(土) 03:41:22
上の場合は*pt1に&aを代入するんですか? pt1にaのアドレスを入れるというのはわかるのですが *pt1にaのアドレスを入れることは可能なんでしょうか?
851 :
デフォルトの名無しさん :2006/02/25(土) 05:56:17
852 :
デフォルトの名無しさん :2006/02/25(土) 06:00:03
>>840 いや、問題は、俺がデバッグしなければいけないという点にある。
見るだけで済むなら何も言わないよ。
プログラムったって、 小規模の物から大規模の物まで。 一人で作る物から多人数で。 一回使うだけの物から、大勢が長期使うものまで。 さまざまなのに、 >俺がデバッグしなければいけない 何で、こんな限定されたことを前提にレスしてるの?
まあ、笑顔でいられないってことだよ。
855 :
前スレ990 :2006/02/25(土) 06:54:03
みなさんありがとうございます。 >>前スレ991 すみません・・・どうやるのかよくわかりません・・・ 何か処理が非常に複雑になるような・・・? >>前スレ994 reallocって(移動される場合には)結局メモリをコピーしているんではないのですか? コピーせずにすますのはx86とかの場合ページ単位でしかできなかったような気が・・・? 間違ってるかもしれませんがよろしくお願いします。
856 :
847 :2006/02/25(土) 07:55:15
答えてくださった皆様ありがとうございました 理解を深めるようさらに勉強していきたいと思います
>>850 ptは*を付けるとint型になると宣言しているのであって、
int *pt = &a;
*ptに&aを代入している訳では無い
int*型のptに&aを代入している
初期化だがな。
mallocの意味教えて
860 :
デフォルトの名無しさん :2006/02/25(土) 12:18:07
>>855 リストにすると探索時間が気に入らないとか言ってたようだが
そんなのはポインタ1個用意しておいて末尾をポイントさせとけば済む話だろ
>>859 memory allocate
記憶割付
862 :
815 :2006/02/25(土) 12:32:15
うまく通じてないみたいなんで詳しく言います 実はあるプログラムがあるのですが(自分が書いたのではない)、そのmakeが通らない 変数が宣言されていないというエラーが大量に出る ソースを見てみると同一ファイル内で例えば70行目でなんたらって変数を使っているがその宣言は3000行目にあるとかそんなことがいっぱいある そのプログラムは開発途中のものではなく、ずいぶん昔に開発済みかつ使われていたもののはずなのでなんでかなあということなんですが どういうことが考えられますでしょうか?
おまえ、あるかないかって聞いたろ、実際に使われたタ奴ならそんなこと聞く必要ないだろ あと、どういう事か聞くなら、ソース見せろやヴォケ
バックアップとって変数宣言上に移動してコンパイル通ればそれでよし。 なぜコンパイル通らない形で保存されてたかなんて推理したって何の意味もない。
>>862 最初からそう書けばまだ少しはましだったのにね。
で、まさかインクルードファイルが見つかってないと言う落ちはないよな?
ソースをアップロードできないならせめて、エラーメッセージだけでも見せてみ。
もしかしてこれで、社会人なのか・・・(((((((( ;゚Д゚)))))))ガクガクブルブルガタガタブルガタガクガクガクガクガク
867 :
デフォルトの名無しさん :2006/02/25(土) 13:10:10
>>862 会社と喧嘩して退職時に嫌がらせでシャッフルしたとか
ノイズの多いスレだな・・・ bar() { foo = 0; } int foo; というコードを通してくれるCのコンパイラなりコンパイルオプションは存在しない。 ただし、barの上(やincludeしているヘッダファイル)で、 extern int foo; すればコンパイルは通る。
状況も分からずにレスするなんて、 無駄なレスだな・・・
870 :
デフォルトの名無しさん :2006/02/25(土) 13:59:02
>Cのコンパイラなりコンパイルオプションは存在しない 甘い 規格では認めていないというだけで、従っていない処理系は世の中に腐るほど存在する 「それ」が C かどうかはベンダがどう名乗るかで決まることで、LR にガタガタわめいても始まらん そのへんは configure でご苦労なことをやっている人たちを見習えや ところで、Makefile があるから make だけでビルドできると早合点してるアフォはどこへ行った? この期に及んで INSTALL を読んでないとかいうオチはねえだろな 会社のソースならドキュメントの残し方に基準があるだろうから 2ch で聞くより先にやるべき事があるんじゃないか
n = 10, a = 5; とすると、 n += (a++) → n = 15 n += (++a) → n = 16 になるのですが、上の式と下の式はどんな風に計算されてるんですか? 上の式が,n =16 にならないのが分からないです・・・
質問する前には最低限検索を。
>>871 n += (a++)はインクリメントされる前のaの値である5がnに加えられる。
n += (++a)ではインクリメントされた後の値の6がnに加えられる。
n = a++ でどうなるか分かってる?
>>876 お前はそんなことを書くためにわざわざここに来てるのか?www
>>877 いいえ、違いますよ
だって、俺は871ですからね♪
879 :
デフォルトの名無しさん :2006/02/25(土) 17:58:52
おまえは今まで食ったパンの枚数を覚えているのか?
枚数って・・・ なんでスライスされたパンなの?
初期化するしないの区別って何ですか?
882 :
デフォルトの名無しさん :2006/02/25(土) 19:01:01
↑目的語を書いてください↑
目的語ってなんですか?
884 :
881 :2006/02/25(土) 19:02:41
>>882 やっぱり目的によって初期化するしないが変わるんですか?
>>884 質問に質問で返さないで。
なぜそういう疑問をもったか言ってみなさい。
886 :
881 :2006/02/25(土) 19:07:26
>>885 疑問というかわからないから聞いてるんです。
>>886 なぜ、自分がそういう疑問をもったかもわからないの?
889 :
デフォルトの名無しさん :2006/02/25(土) 19:26:11
おー、久しぶり Eliza 同士の対話かw
\\_ :三ニ=:::::::ヽ :ヽ.ニ=::て.>廴_ 呼んだ? 三.ヽ= (⌒ヽ;:;:;,.二) ニ=-ヽ:ヽ、,∠.^^ぅ 〃,べ= ̄ニ二 ̄ /;:ィリ ノノ ,.へヽ ;:ヘ/ ̄ ̄ ̄Vヽヽ ソ ├┤|
891 :
881 :2006/02/25(土) 19:34:52
>>890 宿題スレにお帰りください
あるいはぎゃるのぱんてー1枚
894 :
デフォルトの名無しさん :2006/02/25(土) 20:58:06
誰でも匿名で参加できる掲示板に書き込みをしている知らん奴がどういうつもりかなんて関係ないね 技術的に興味のある話題なら相手するし、気が向いたら質問に答えてやることもあるし、痛い奴は煽ることもある 他人の領分に変に干渉する誰かさんは3番目に該当するわけだが・・・
\\_ :三ニ=:::::::ヽ :ヽ.ニ=::て.>廴_ ポカーン 三.ヽ= (⌒ヽ;:;:;,.二) ニ=-ヽ:ヽ、,∠.^^ぅ 〃,べ= ̄ニ二 ̄ /;:ィリ ノノ ,.へヽ ;:ヘ/ ̄ ̄ ̄Vヽヽ ソ ├┤|
突然ですが、 doble型のa,b,cを c = a % b とするとエラーがでます。何か解決方法はありますか?
C言語を勉強しているのですが、3^(1/3)のような分数乗の計算の方法がわかりません。 pow関数では分数乗は扱えないのでしょうか? お願いします。
>>897 普通にできるよ。
pow(3.0, 1.0 / 3.0);
1/3とか書いちゃだめよ。
1.doble型などない 2.全角 Solution バカが無理してCなんか覚えるな
double型は小数点以下まで演算できるので 整数の余りという概念はありません、だっけ?
901 :
デフォルトの名無しさん :2006/02/25(土) 22:06:39
文字列リテラルのエスケープ文字に全角の逆斜線を使う奴には甘いくせに いわば double スタンダードってやつだな
902 :
デフォルトの名無しさん :2006/02/25(土) 22:13:05
rand関数について質問なんですが、0と2のみの乱数を発生させる事は できるのでしょうか? 例えばrand % 3 で0〜2の乱数を発生させる事ができますが、 1を除いた0と2のみの乱数を発生させる事はできるでしょうか? これについて教えて頂きたいのですが、お願いします。
計算してみればいいだろ
rand()%2*2 終わり
905 :
デフォルトの名無しさん :2006/02/25(土) 22:15:46
てか、これくらい閃かないのなら。プログラムなんかやめたほうが・・
907 :
デフォルトの名無しさん :2006/02/25(土) 22:17:48
>>903 さん
申し訳ないです。
>>904 さん
ありがとうございます!!こんな単純な事とは思いつきませんでした・・・。
908 :
デフォルトの名無しさん :2006/02/25(土) 22:18:52
909 :
デフォルトの名無しさん :2006/02/25(土) 22:20:00
>>896 解決法: 「数値なら何にでも double を使っとけ」と教えたボンクラ師匠をコンクリートで固めて海に捨てる
fmod
911 :
904 :2006/02/25(土) 22:26:56
>>905 のほうがコードとしては優れているなぁ。思いつかなんだ。
bit演算を
>>902 が理解できるかどうかは別として
奇数偶数判定に&1を使ってる人なら自然な発想だ
914 :
スイッチ教のおつげ :2006/02/25(土) 22:58:57
おまいら!!! いいお告げだ。 プログラムからすべての分岐をなくせる気がする。
>>914 おぉ。神が舞い降りたか。むしろ髪が舞い落ちたか。
916 :
スイッチ教のおつげ :2006/02/25(土) 23:04:08
xの範囲が -M < x < Mだとすると if( x >= 0) A; else B; が swich( (int)((x + M)/ M ) ) { case 0: B; case 1: A; } に変換できる。
今禿って言いそうになった香具師ちょっとこっち来い
うるせー刷毛!
919 :
デフォルトの名無しさん :2006/02/25(土) 23:09:44
夜中にウホにこっち来いって言われても・・・
switch (x >= 0) { case 0: B; break; case 1: A; break; } でいいじゃん
bool式使ってるじゃねーかうんこ君め
922 :
スイッチ教のおつげ :2006/02/25(土) 23:20:49
訂正: >プログラムからすべての分岐をなくせる気がする。 → >プログラムからすべての比較(とそれに伴う分岐)をなくせる気がする。
if( x >= 0) A; else B; でいいじゃん
文: 式文 名札付き文 分岐文 switch文, break文, continue文, return文, goto文 選択文 if文 繰返し文 for文, while文, do文 複文 用語は正確にね
関数テーブル使えば簡単じゃん。
926 :
デフォルトの名無しさん :2006/02/25(土) 23:53:50
927 :
デフォルトの名無しさん :2006/02/26(日) 00:06:28
#include "stdafx.h" #include <stdlib.h> #include <time.h> #define N 10000000 #define M 10000 int a[N],b[N],d[4*M+1],i,L;clock_t c[2]; fuka(int j){int x;x=j; x*=x;if(x>M)x=x%M;x*=x;if(x>M)x=x%M; x*=x;if(x>M)x=x%M;x*=x;if(x>M)x=x%M; x*=x;if(x>M)x=x%M;x*=x;if(x>M)x=x%M; x*=x;if(x>M)x=x%M;x*=x;if(x>M)x=x%M;} fnif(){ for(i=0;i<N;i++)if(a[i]<b[i])fuka(i); else fuka(i+1);} fnsw(){ for(i=0;i<N;i++)switch((int)((a[i]-b[i]+L)/L)){ case 0: fuka(i);break;case 1: fuka(i+1);break;}} fnsx(){ for(i=0;i<N;i++)switch(d[a[i]-b[i]+L]){ case 0: fuka(i);break;case 1: fuka(i+1);break;}} main(void){ for(i=0;i<N;i++){a[i]=rand()%M;b[i]=rand()%M;} L=2*M;for(i=0;i<=2*L;i++)d[i]=(int)(i/L); c[0]=clock();fnif();c[1]=clock(); printf("ifで分岐に%d clockかかりました。\n" , c[1]-c[0]); c[0]=clock();fnsw();c[1]=clock(); printf("swichで分岐に%d clockかかりました。\n" , c[1]-c[0]); c[0]=clock();fnsx();c[1]=clock(); printf("swichで分岐に%d clockかかりました。\n" , c[1]-c[0]);}
928 :
デフォルトの名無しさん :2006/02/26(日) 00:08:15
ifで分岐させてもswitchでも対して変わらないのだが。 ジャンプテーブルを作らせるにはどうしたらいいですかね。
自分で作れ
930 :
デフォルトの名無しさん :2006/02/26(日) 00:10:29
\\_ :三ニ=:::::::ヽ :ヽ.ニ=::て.>廴_ ポカーン 三.ヽ= (⌒ヽ;:;:;,.二) ニ=-ヽ:ヽ、,∠.^^ぅ 〃,べ= ̄ニ二 ̄ /;:ィリ ノノ ,.へヽ ;:ヘ/ ̄ ̄ ̄Vヽヽ ソ ├┤|
>>928 コンパイラによっては自動でジャンプテーブル作るかもしれないけど、
自分でジャンプテーブル作ってやったほうが確実。
933 :
デフォルトの名無しさん :2006/02/26(日) 00:21:46
分岐させる量が多いとifよりswitchのほうが速くなるから
ジャンプテーブルというものが存在しているだろう事はわかるのですが
>>927 だとfnif関数とfnsx関数の速度がほぼ同じだから
switchがifと同じ分岐になっているらしい。どうやればswitchの方が速くなりますかね?
> switchがifと同じ分岐になっているらしい。 それが最高速である可能性は? つか、ジャンプテーブル使いたかったら自分でテーブル作れと。
935 :
デフォルトの名無しさん :2006/02/26(日) 00:30:55
934 どうやら最高速だったようです。 fnsy(){ for(i=0;i<N;i++)fuka(i);} と同じ速度でした。
937 :
デフォルトの名無しさん :2006/02/26(日) 00:35:06
>>933 この程度の分岐ではswitch文の利点(速度)が発揮されない
938 :
デフォルトの名無しさん :2006/02/26(日) 00:36:08
速度は「最」かどうか本当に関係あるのか? ある基準値をクリアすればそれ以上はどうでもいい場合と、 ひたすら最速を競う勝負とあるわけだが・・・
939 :
デフォルトの名無しさん :2006/02/26(日) 00:39:05
まずは単純なループよりも、ifを入れた場合の方が鈍くなるようなものを 作らなければならないのだが... コンパイラの最適化等で無視されないようなものをどう作ったらいいんだ?
941 :
デフォルトの名無しさん :2006/02/26(日) 01:39:08
いろいろ試してみた結果、分岐の数が増えればifよりswitchの方が速いが それでも足し算、掛け算、代入などよりは十倍くらい鈍いことが判明した。 ジャンプテーブルさえ作れれば分岐のコストが無くせると思ったのだがそうでは無いようだ。 結局、分岐はなるべく減らそう、ということだ。
942 :
デフォルトの名無しさん :2006/02/26(日) 01:44:04
線形探索だけで論じてるとしたら痛杉
最適化みたいな、コンパイラや環境にもろ依存するような話もこのスレの範疇なの?
944 :
デフォルトの名無しさん :2006/02/26(日) 01:49:03
違う 配列のレンジチェックまで最適化して貰えるとか思ってるアフォが集まりやすいが
945 :
941 :2006/02/26(日) 01:50:13
943 スイッチやイフはどのパソコン、コンパイラでも時間がかかるだろ。 一般論だ。
なんでパソコンに限定してるの?
947 :
デフォルトの名無しさん :2006/02/26(日) 01:51:46
さっそくキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
UNIX-C と ANSI-C の違いってなんですか?
ifよりswitchの方が早いとか池沼だな そんなに気になるなら全部アセンブラで書けや
950 :
デフォルトの名無しさん :2006/02/26(日) 02:37:37
コンパイラの最適化により if でも switch でも同じコードが作られる ことが、今後起こらないとも限らない。(勝手にジャンプテーブルを 作るということ)
952 :
デフォルトの名無しさん :2006/02/26(日) 06:22:51
やっぱりifの方が速いな。 頻繁に起こる分岐を早めに確定したほうがいいからな。 30分岐だったとしても、等確率だったらスイッチだが どれか一つが50パーセントで起こるならそれを決定してしまった方がよい。
if文はブロックなしで書いたほうが速いの? もしそのブロック内で宣言なければ最適化されてる?
954 :
デフォルトの名無しさん :2006/02/26(日) 09:00:51
char * const *(* next)(); ってどういう意味?
nextはポインタで、その型は 引数なしでchar * const *を返す関数である って意味だ。 char *const *func(); char *p; next = func; p = next(); だな。内側から分解してみると理解しやすい。
>>953 >if文はブロックなしで書いたほうが速いの?
この質問は高校生までなら許す。関係ない。
>もしそのブロック内で宣言なければ最適化されてる?
なんとなく質問の意味は想像できるけど、宣言を行う場所は
最適化どうこうで選ぶもんじゃないから、宣言される場所によって
それがどういう意味を持つかで(ローカル変数にしたいのか
そうでないのかなど)考えるように。
958 :
デフォルトの名無しさん :2006/02/26(日) 11:07:42
昨日に引き続き、朝から申し訳ないんですが、迷路探索プログラムについて 質問させて頂きます。0を空間、2を壁としています。 222 222 202 222 222 222 このように周りは初めの条件で2で囲ませ、それ以外は昨日教えて頂いた rand & 2を使いランダムに数字を代入して行くのですが、実行結果を見ると 右のように全て2が代入されてしまいます。 #define LEFT 7 #define RIGHT 7 #define MAX 7 として置きます。実行前にsrand〜もしています。 void CreateTable(int table[LEFT][RIGHT]) { int i,j; for(i = 0; i <= MAX; i++){ for(j = 0;j <= MAX; j++){ /*****上下の淵を2で埋める*****/ if((table[i][j] == table[0][j]) || (table[i][j] == table[LEFT][j])) table[i][j] = 2; /*****左右の淵を2で埋める*****/ else if((table[i][j] == table[i][0]) || (table[i][j] == table[i][RIGHT])) table[i][j] = 2; /****中身をランダムに0と2で埋める****/ else table[i][j] = rand() & 2; } } }どこの条件が悪いのか教えて頂けませんか?お願いします。
デバッガがprintfで追えって・・・
>>958 エスパーするとこの比較条件が多分間違い
if((table[i][j] == table[0][j]) || (table[i][j] == table[LEFT][j]))
table[i][j] = 2;
/*****左右の淵を2で埋める*****/
else if((table[i][j] == table[i][0]) || (table[i][j] == table[i][RIGHT]))
table[i][j] = 2;
たぶん
if(i==0 || i==LEFT-1 || j==0 || j==RIGHT-1)
table[i][j]=2;
だと思う
961 :
デフォルトの名無しさん :2006/02/26(日) 11:13:32
>>959 プリントエフで追うと何回やっても2のみの出力結果になってしまいます・・・。
もう少し検索してきますorz。
だから、なんで結果だけを出力するんだよ。
963 :
デフォルトの名無しさん :2006/02/26(日) 11:15:38
>>960 ありがとうございます!!一度それで試してみます。
964 :
デフォルトの名無しさん :2006/02/26(日) 11:18:37
>>962 いえ、ランダムに生成した表では無く、初めから配列に0と2を自分で代入しておいて
探索させると成功するので、ランダムに生成したこの表の条件が
間違っていると思ったからです。
( ゚д゚)ポカーン
966 :
960 :2006/02/26(日) 11:21:54
( ´゚д゚`)
967 :
デフォルトの名無しさん :2006/02/26(日) 11:23:51
>>960 すいません。自分の淵の2つの条件を
>>960 に書いてある条件に置換しても
やはり出力結果は全て2ですorz。
昨日も誰かに言われてたけど、あなたプログラムに向いてないよ。 辞めた方が吉。
969 :
デフォルトの名無しさん :2006/02/26(日) 11:28:10
>>968 分かりました。自力で解く事にします。ありがとうございました。
解くって・・・ちょwwwおまwwww
971 :
デフォルトの名無しさん :2006/02/26(日) 11:31:20
じゃあ、ヒント下さいよ・゚・(つД`)・゚・
>>958 >void CreateTable(int table[LEFT][RIGHT])
~~~~~~~~~~~~~~~~~~~~~~
こういう書き方って初めて見たんだけど、最近はできるの?
あと、if文の条件がおかしくないか?
上下左右の淵を 2で埋めるんだったら、
if ((i == 0 || i == LEFT) || (j == 0 || j == RIGHT)) {
table[i][j] = 2
} else {
table[i][j] = rand() & 2;
}
でいいだろうし。
でないと、初期化してないtable[i][j]の値でif文実行になるし。
どーでもいいが、MAXの意味って何なんだ?
もちっと勉強してこい。
973 :
デフォルトの名無しさん :2006/02/26(日) 11:55:49
>>972 先生〜〜(ノ∀`)〜〜!!できましたよ!!ランダムに生成する事ができています!
感謝致します。あと少し弄って完成させます。
本当にありがとうございましたm(_)m
> こういう書き方って初めて見たんだけど、最近はできるの? 昔からできてない?
わたしたちは、また一人、ゆとり君を生み出してしまった・・・
そう、配列の範囲外アクセスにまったく気づかないゆとり君をね......
977 :
デフォルトの名無しさん :2006/02/26(日) 12:05:31
基本的なことなんですが質問です。 エディタで逆スラッシュの入力をしたいのですが、 どうすればいいのですか?教えてください。
\
980 :
デフォルトの名無しさん :2006/02/26(日) 12:07:25
最後にこれで消えますので。
>>960 に書いてあるプログラムの条件で既に合っていました。
自分の条件(LEFT RIGHT)が <= にしていたため間違ってしまいました。
申し訳ないです、本当にすいませんでした。
おお、範囲外アクセスに気づけたみたいだ。 ゆとり君と言ったのは間違いであったと謹んで訂正する
範囲外がどうこうのレベルじゃないだろw
>>955 このスレでは間違い。
引き数リスト無しでchar * const * を返す関数は、
引き数無しでchar * const * を返す関数とは違う。
それと、その後のpも大間違い。
自分でchar * const *を返すと書いておきながらなんで間違うかなぁw
>>970 スレ立てよろしく。
反応ない様なら次、>985辺りで。
うっかりタイプ
986 :
955 :2006/02/26(日) 12:38:15
すまん、間違えてた。 勉強しなおすよ。
987 :
デフォルトの名無しさん :2006/02/26(日) 12:38:59
#include<windows.h> #include<stdio.h> #include<stdlib.h> int main(int argc,char* argv[]){ int a=100,b=18,*p; //ポインタ p=&a ; printf("p:%d \n\n",*p); //参照 int &c=a; //エラー /* int &c; &c=a; */ printf("c:%d \n\n",c); return 0; } 参照とポインタの違いは・・・? メリット&デメリットを教えてくれ! ポインタのメリットは、*(p+i)とかやってアドレスずらせるだけかな。
ググればいくらでも解がある
>>987 C言語的には参照など無いというのが回答
990 :
987 :2006/02/26(日) 12:43:34
うだうだ言ってないで教えろよ! その為にスレがあるんだろ
ポインタと異なる点は、「一度初期化したあとはその指すアドレスを変更できない」という点である。よって、ポインタがどこを指しているのか曖昧になることもないし、NULLポインタのような特殊な状態を持つこともない。この点で参照はポインタよりも安全だと言われる。 もちろん、参照だけで生きていけるほど世の中甘くはないし、ポインタを完全に廃してしまえるわけではない。 そこで、私がポインタと参照を使い分ける時の基準について書いてみようと思う。 高速なオブジェクトの引き渡しには参照 関数に構造体やオブジェクト(実際にはどちらも同じ物であるが)を渡す場面が数多くある。 そのような場合に通常の値渡しを行うと、クラスのメンバを全てコピーして新しいオブジェクトを生成するため、 巨大なオブジェクトではオーバーヘッドがものすごいものとなる。そこで、オブジェクトを渡すときには参照を使う。 なお、オブジェクトが変更されないことを明示し保証するためにconstをつける。 値を変更する場合にはポインタ 関数に変数(オブジェクトも含む)を渡して、関数内部で状態を変更させて返したい場合がある。 値を変更する場合には、参照を使っても全く同じ事が可能であるが、 呼び出し側で「値が変更される」ことをわかりやすくするためにポインタを使う。 (参照による呼び出しでは、一見すると値渡しのようにも見えるため、C言語出身の私は値が変更されないような イメージを受ける。) ↑検索してみましたーーー!!! フムフム、色々できるポインタの方がいいかも><
( ゚д゚)ポカーン
でも何で「参照」なんだろ。 ポインタだって、言っちゃえば参照だし、 どうせなら「別名」とかの方が良いような?
( ゚д゚)ポカーン
( ゚д゚)ポカーン
( ゚д゚)ポカーン
次スレマダー?チンチン
( ゚д゚)ポカーン
「C言語なら俺に聞け!」はこのスレをもって終了いたしました。 長らくのご愛顧、誠にありがとうございました。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。