1 :
デフォルトの名無しさん :
03/07/09 00:10
4 :
デフォルトの名無しさん :03/07/09 00:11
宣伝に負けた( ̄o ̄;)
宣伝君をだれか出入り禁止にしてくれ。鬱陶しくてかなわん。
>>6 禁止は無理だけど、削除依頼してくれれば消すよ。
8 :
デフォルトの名無しさん :03/07/09 00:23
MTっていう乱数生成アルゴリズム知ってますか?
有名だな
インタプリタのサイトはテプレから外さないか?
13 :
デフォルトの名無しさん :03/07/09 00:28
と亀さんはいった。
亀さんそれじゃあだめだよ。
なまらやる気の無い亀さん?
東京発13:XXのぞみXX号に乗って静岡駅で降りる ここまでは、目撃されている情報から間違いがない そして、今度は東京行きのぞみXX号にのって…
18 :
デフォルトの名無しさん :03/07/09 00:55
fread ってどするの?
よむんだよ。
>>18 #include <stdio.h>
typedef size_t At;
typedef const void * N;
typedef size_t T;
typedef FILE * DoCoMo;
At fread(N,T,T,DoCoMo);
レス遅くなりました。 前スレの913,914さん、ありがとうございました。 特に914さんの説明、かなり納得できました。 どうもでした。
#include <stdio.h> #include <stdlib.h> int main(){ int a=1000,b=1000,i=0,mina=0,minb=0,r=rand(); printf("%d %d %d\n",i,a,b); for(i=1;i<100;i++){ if(16000<r&&r<24000){ a+=4; b-=4; } if(24000<r&&r<32000){ a-=2; b+=7; } if(mina<a) mina=a; if(minb<b) minb=b; printf("%d %d %d\n",i,a,b); } printf("mina=%d minb=%d\n",mina,minb); } どんな(1-32768のどれか)乱数を出すかで、乱数がどの範囲に入るかで a,bの値が下がったり上がったりするプログラムを作ったつもりなんですが、 aの値もbも1000を出力したままずっと変わりません。何でなんですか?
r = rand() がループの外だから
C言語についてなんですが、文字コード番号を打って入力し、出力する方法が分かりません。 どなたか知ってたら教えてください
日本語についてなんですが、脳内語を入力し、口語を出力する方法が分かりません。 どなたか知ってたら教えてください
#include <stdio.h> #include <stdlib.h> int main(){ int a=1000,b=1000,i=0,j,mina=1000,minb=1000,a0=0,b0=0; printf("%d %d %d\n",i,a,b); for(j=0;j<20;j++){ for(i=1;i<100;i++){ if(16000<rand()&&rand()<24000){ a+=4; b-=4; } if(24000<rand()&&rand()<32000){ a-=2; b+=7; } if(mina>a) mina=a; if(minb>b) minb=b; printf("%d %d %d\n",i,a,b); a0+=mina; b0+=minb; } printf("mina=%d minb=%d\n",a0/1000,b0/1000); } } 上のプログラムにちょっと付け足したものです。 mina,minbを試行で何度も出して、試行回数で割って 平均値を求めようとしたんですけど、mina,minbは変な値が出てきました 普通は1000程度の数がでます。どこがおかしいんでしょうか?
>27 >if(16000<rand()&&rand()<24000){ 最初のrand()と二つ目のrand()は別の値になる。
マヌケだ…
勝った・・・
#include <stdio.h> int main(void) { char str[] = "abcdefg"; int k; for(k = 0; k < 7; k++){ if(str[k] == "b"){ printf("%s\n", str); break; } } return 0; } abcdefgが出力されるはずなんですが・・・。 移植性の無いポインタ変換という警告が出てます。 よろしくお願いします。
33 :
デフォルトの名無しさん :03/07/09 09:42
関数内で fopen したファイルのポインタを呼び出し元に返すことは可能か? 例えば、こんな感じ。 main(){ FILE *file; func(file); } void func(FILE* f){ f=fopen("xxx", "r"); } この場合、勝手にクローズされちゃう?
>>32 str[k] と "b" を比較しているから。
>>33 当然可能。勝手にクローズするはずがない。行方不明になるが。
>>33 void func(FILE** fp) {
*fp = fopen(...);
}
FILE* func() {
return fopen(...);
}
ごめんなさい。書き方悪かった。 return しないでできる?引数渡しで。
出来るってばよ。
returnしなけりゃ処理が戻ってこないから難しいな。
40 :
デフォルトの名無しさん :03/07/09 11:23
質問 varchar型に格納されている文字列の比較ってどうやるん? そのまま == で比較したらキャストエラーが出るのだが varchar A[10][5]; varchar B[10][5]; ---詳細省略-------------------------------------------- varcharのA配列にSQLで取った値をカーソルFETCHで値格納 varcharのB配列にSQLで取った値をカーソルFETCHで値格納 ------------------------------------------------------- if(A[1].arr == B[1].arr){ }
Cにvarcharなんていう型はありません。
42 :
デフォルトの名無しさん :03/07/09 11:32
Pro*Cは駄目なの?
>>40 AとBは二次元配列だから、添え字がおかしいんじゃないの?
あと、varchar同士の比較は、長さを比較して、一致してたら
memcmpを使えばいいのかな?
Pro*Cって知らんから、間違ってるかもしれんけど。
Pro*cは、SQLをCのソースに埋め込む開発ツールですな。 ということで、スレ違いなんだってばさ。
激しくアフョ丸出しで悪いんだけど、 画面をクリアする方法ってどこ探しても載ってないんすよね・・・
system("cls"); /* Windows/MS-DOS */ system("clear"); /* UNIX/Linux */
int i;for(i=0;i<1000;i++){printf("\n");}
C言語ならオレだよオレオレ
>>52 すげえ。C 言語とかいっといてオレだよとかいってるよ。この人。
55 :
デフォルトの名無しさん :03/07/09 18:10
>>40 if(A[1].arr == B[1].arr)
でなくて
if(strcmp(A[1].arr, B[1].arr)==0)
では。
厳密に言うと if (A[1].len == B[1].len && strcmp((char*)A[1].attr, (char*)B[1].attr)==0) かな。スレ違いなのでこれくらいに。
>>56 varcharの文字列は0がついてるとは限らないから、strcmpで比較はまずいよ。
strncmp
61 :
デフォルトの名無しさん :03/07/09 20:48
registerは古くさいですか?
62 :
デフォルトの名無しさん :03/07/09 20:49
63 :
デフォルトの名無しさん :03/07/09 20:54
staticって何ですか? 「静的変数」と言われても良く分かりません。
古いです。
#include <stdio.h> #include <stdlib.h> int main(){ int a[99],i1,i2,i3,i4; for(i1=0;i1<99;i1++){ a[i1]=rand()%51; } for(i2=1;i2<12;i2++){ for(i3=0;i3<99;i3+=49){ while((a[i3]==a[i3+1]||a[i3]==a[i3+2]||a[i3]==a[i3+3]||a[i3]==a[i3+4]||a[i3+1]==a[i3+2]) ||(a[i3+1]==a[i3+3]||a[i3+1]==a[i3+4]||a[i3+2]==a[i3+3]||a[i3+2]==a[i3+4]||a[i3+3]==a[i3+4])){ a[i3+1]=a[i3+1+(4*i2)]; a[i3+2]=a[i3+2+(4*i2)]; a[i3+3]=a[i3+3+(4*i2)]; a[i3+4]=a[i3+4+(4*i2)]; } i4=(i3/49)+(i3%49); printf("a[%d]=%d\n",i4,a[i4]); } } } トランプを5枚配ったときのトランプの出方を出力使用としたのに、 このソースでは実行すると何にもでてきません 一応、同じカードを引かないように工夫はしたつもりです。
ここって、バグを指摘するスレなの?
放置でつか?
間違えました。上のプログラムはちゃんと動きます でも、なんで結果は、a[0],a[1],a[2]が延々とでてしまうんでしょうか
>>70 正直ソースが煩雑で見る気にならない。
山から1枚カードを引く関数 pull_card()
を作ってmainから必要な数だけ呼べ。
そうすればすっきりして、おかしいところもわかるだろ。
>>65 おまえ、www.ioccc.orgに出馬しろ、ぜひ。天然は強い。
>65 ひょっとして、0-nまでの数を、n個の配列に、重複無く・ランダムに 放り込む方法を知らないとか?
本当は頭のいい人なのかもしれない
知るとか知らないとかいうもんか? ちょっと考えれば思いつくと思うが。
76 :
デフォルトの名無しさん :03/07/09 22:32
∩( ´Α`)質問です static const int big_tbl[] = { /* ウンザリするほど巨大なテーブル */ }; static void func(void){ /* テーブル使ってほにゃらら */ } があった時、ソースが激しく見づらいので、 static void func(void){ /* テーブル使ってほにゃらら */ } static const int big_tbl[] = { /* ウンザリするほど巨大なテーブル */ }; という配置のしたいのですが、どうすればいいんでしょうか? 前方参照みたいなことは可能ですか?
乱数の出方によっては、whileが無限ループにならないか?
78 :
デフォルトの名無しさん :03/07/09 22:35
じゃなくて、staticを消して先頭にstatic const int big_tbl[];
またまちがった(T_T) staticを消して先頭にextern const int big_tbl[];
またまちがった(T_T) externを消して先頭にstatic const int big_tbl[];
>>80 extern const int big_tbl[];
static void func(void){
/* テーブル使ってほにゃらら */
}
const int big_tbl[] = {
/* ウンザリするほど巨大なテーブル */
};
こんなカンジですか?
ありがとうございます。今環境がありませんが後で試して見ます
tableは大きいなら別のファイルにするという手もあるな。
別ファイルにしてインクルード、 もしくは実行時にファイルから読み込み。
>>65 シャッフルアルゴリズム
1. とりあえず順列にでいいから配列に全部の数を詰める。
2. i 番目の要素と別の要素とを入れ替える作業を i = 0 〜 (n-1) まで順番に行う。
3. それを何度か繰り返す。
87 :
デフォルトの名無しさん :03/07/09 23:36
define マクロについて質問です。 既製のソースをそのままで for の条件式の所にだけチェック用の関数を入れたいのですが #define for(a) for(a) のようにはできても #define for(a;b;c) for(a;check(b);c) のようにはできません(「;」は区切りに使えないみたいです) 置き換え後は別に for じゃなくてもいいので #define for(a;b;c) {a;while(b){c;}} とかも考えたのですが、左側部分の問題は残ったままです。 カンマで #define for(a,b,c) {a;while(b){c;}} とすると、そもそも現在のソース全てに手を入れなければならずに、 元に戻すのも大変な上、 for(a=0, b=0; a < b; ++a, --a) みたいに書いてある所はどうしようもなくなってしまいます。 何か方法はないでしょうか?
88 :
デフォルトの名無しさん :03/07/09 23:45
>>87 #define FUNCTIME(f,r) \
{ \
unsigned long time = GetTickCount(); \
(r) = (f); \
time = GetTickCount() - time; \
printf("%s time = %lu[ms]\n",#f,time); \
}
89 :
デフォルトの名無しさん :03/07/09 23:47
VCじゃデバッグしか使えないから
90 :
デフォルトの名無しさん :03/07/09 23:52
あ、勘違い。
>>65 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int have[5];
int opn[52]={0};
const char mark[4][3]={"▲","■","●","★"};
const char num[13][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
int i,r;
srand(time(NULL));
for(i=0;i<5;i++)
{
r=rand()%52;
if(opn[r]) continue;
else {opn[r]=1;have[i]=r;}
}
for(i=0;i<5;i++) printf("%s%s\n",mark[have[i]/13],num[have[i]%13]);
return 0;
}
>>92 間違えた。
if(opn[r]) continue;
↓
if(opn[r]) {i--;continue;}
95 :
デフォルトの名無しさん :03/07/10 02:35
>>94 同意。で、それやるなら「プリプロ後ファイルを」行連結しつつ処理かな。
それでも "for (x;y" なんて意地悪な文字列があるとコケがちなんで、
文字列識別位はしないといかんかも。
>>87 どうしても既成のソースいじれないの?
正規表現置換で for (a; CONDCHKFOR (b); c) とかにしちゃって
チェック外す時に #define CONDCHKFOR なり、
inline static int CONDCHKFOR (int a) { return a; }
で良い気がするんだけど。
>CONDCHKFOR やぼったい
>>87 #define for(a;b;c) for(a;check(b);c)
↓
for(a;
と展開されるはず
だいたい大して楽になってないじゃないか
#include<stdio.h> int main() { printf("1+2=%d\n",1+2); return 0; } ↑これをコンパイルして実行したら 何か一瞬だけ表示されて閉じちゃうんですけど…何ででしょ? ちなみにVisual C++.net2003使ってます、よろしくお願いしまつm(__)m
100 :
デフォルトの名無しさん :03/07/10 12:10
main でファイルから読み込んでいた文字列を、 関数内で行うようにしたいのですが、うまくいきません。 具体的に、 main(){ char file[]="filename"; char a[LENGTH], b[..], c[...]; char str[LENGTHLINE]; FILE *fp; /* a の読み込み */ if ((fp=fopen(filename, "r"))!=NULL){ fgets(str, LENGTHLINE, fp); sscanf(str, "%s\n", &a); fclose(fp) } /* b の読み込み */ /* c の読み込み */ 処理 }
101 :
デフォルトの名無しさん :03/07/10 12:11
となっているところを、 main(){ char file[]="file"; char a[LENGTH], b[..], c[..]; read_abc(file, a, b, c); 処理 } void read_abc(char *file, char *a, char *b, char *c){ char str[LENGTHLINE]; FILE *fp; /* a の読み込み */ if ((fp=fopen(file, "r"))!=NULL){ fgets(str, LENGTHLINE, fp); sscanf(str, "%s\n", &a); fclose(fp); } /* b, c の読み込み */ } というようにしているのですが、 コンパイルは通っても segmentation Fault になってしまいます。 main で配列サイズを決めていても、read_abc で配列サイズを確保しなくては ならないのでしょうか? また、一般的には関数間での文字列の受け渡しはどのようにするのでしょうか。 ご教授お願いいたします。
sscanf(str, "%s\n", &a);
>>99 プログラムが終了すればコマンドプロンプトも閉じられる。
そういう仕様。(at Windows コマンドプロンプト)
つか、スレ違い。
>>101 >sscanf(str, "%s\n", &a);
a はポインタぢゃないのか?
ところでコレ、sscanf の仕様を理解して使っているならいいが、それにしても
無駄だな…
デバッグ出力用のマクロの引数を printfみたいな、引数の数無制限みたいな感じにしたいんですが ↓現在こんな感じ #ifdef DEBUG_ #define DEBUGOUAT( _f_ , _v_ ) \ {\ fprintf(stdout,_f_,_v_);\ }\ #else #define DEBUGOUAT( _f_ , _v_ ) #endif こうやっても、_v_の所は、一個しか引数かけないです。 どう記述したら、無制限にできるのですか?
>>104 コンパイラが C99 に対応してれば
#ifdef DEBUG_
#define DEBUGOUAT(...) fprintf(stdout, __VA_ARGS__)
#else
#define DEBUGOUAT(...)
#endif /* DEBUG_ */
が使えるんだが、そうでなけりゃ関数作るしか。
int debugprintf(const char *form, ...)
{
va_list p;
va_start(p, form);
return vfprintf(stdout, form, p);
}
#ifdef DEBUG_
#define DEBUGOUAT debugprintf
#else
#define DEBUGOUAT /* none */
#endif /* DEBUG_ */
>>104 #ifdef DEBUG_
#define DEBUGOUT(params) printf params
#else
#define DEBUGOUT(params)
#endif
DEBUGOUT(("Hoge %s.\n", "hoge"));
で、fprintf は諦める。
stderr とかに出したい場合はそれなりの関数を用意する。
そういや、 ((void*)0)(i = 0); とできて、さらに i = 0 が実行されないというのは、 C++ のみの仕様だっけ? C89 でもできるなら #ifdef DEBUG_ #define DEBUGOUT printf #else #define DEBUGOUT ((void*)0) #endif でいいんだけど。
#define DEBUGOUT 0 || で、最適化を期待
何秒間の間に数字の1を何回押したかというプログラムを作りたいのですが 誰か教えて下さい。 何秒間というのはランダムです(5秒〜30秒ぐらいの間)
> 誰か教えて下さい。 何を?
111 :
デフォルトの名無しさん :03/07/10 20:57
malloc関数について教えてください! mallocが返す値ってポインタですよね。 IBMにあったサンプルプログラムで下記のようなコードがあるんですけど、 TIFFRead~()の3つ目の引数で、ポインタにint型の整数を加えているのがわかりません。 確保した領域がどこにあるのかを示す値に加えちゃたら どこか変なところを指しちゃったりしないんですか? char *buffer; int imageOffset=0; buffer = (char *) malloc(bufferSize) for (stripCount = 0; stripCount < stripMax; stripCount++){ if((result = TIFFReadEncodedStrip (image, stripCount,buffer + imageOffset,stripSize)) }
>>111 buffer += imageOffset じゃないから大丈夫。
114 :
デフォルトの名無しさん :03/07/10 21:06
質問(C言語) 構造体 name のメンバ変数 strName の値をqsort関数を使い ソートを行いたい。 どうやれば良いのか教えてください。 typedef struct _Name{ char strName[30] ; } Name ; Name name[7] ; strcpy( name[0].strName, "C" ) ; strcpy( name[1].strName, "X" ) ; strcpy( name[2].strName, "B" ) ; strcpy( name[3].strName, "BB" ) ; strcpy( name[4].strName, "A" ) ; strcpy( name[5].strName, "AB" ) ; strcpy( name[6].strName, "ZX" ) ;
strName をソートすんの?
116 :
デフォルトの名無しさん :03/07/10 21:13
>>115 そうです。
文字列ですが出来ますか??
>>116 本当に?
strName でソートすんじゃないの?
strNameをkeyにしてnameをソート #include <stdio.h> #include <string.h> typedef struct _Name{ char strName[30] ; } Name ; int NameCmp(const void *a, const void *b){ return strcmp(((Name*)a)->strName,((Name*)b)->strName); } main(){ Name name[7] ; int i; strcpy( name[0].strName, "C" ) ; strcpy( name[1].strName, "X" ) ; strcpy( name[2].strName, "B" ) ; strcpy( name[3].strName, "BB" ) ; strcpy( name[4].strName, "A" ) ; strcpy( name[5].strName, "AB" ) ; strcpy( name[6].strName, "ZX" ) ; qsort(name, 7, sizeof(Name),NameCmp); for(i =0;i<7;++i) printf("%s\n",name[i].strName); }
119 :
デフォルトの名無しさん :03/07/10 21:21
>>117 そうです。
strNameでソートします。
>>99 スレ違いだけどヒント。
int main()
{
…
(σ゜Д゜)σゲッツ!!
return 0;
}
若しくは、コマンドプロンプト開いて、
プロンプト>実行ファイル名
(σ゜Д゜)σゲッチャー!!だろ
ヒントだからさ。
123 :
デフォルトの名無しさん :03/07/10 21:36
>>113 なるほど。言われてみれば確かにそのとうりですね。
ありがとうございます。
でも、それじゃあ buffer + imageOffset ってどういう処理をしてることになるんでしょうか。
度々すいませんがお願いします。
>>123 buffer先頭からimageOffsetだけポインタをインクリメントした先のポインタを返す。
126 :
デフォルトの名無しさん :03/07/10 21:47
>>124 なるほど。
よく見れば
>>1 にも書いてあるのに
丁寧にどうもありがとうございました。
127 :
デフォルトの名無しさん :03/07/10 22:21
うに
128 :
デフォルトの名無しさん :03/07/10 22:31
int型変数、a,b,の値をそれぞれ10,4として、次の文をそれぞれ 実行したときのaの値を表しなさい。 (1) a/=b (2) a+5*b-- (3) a=a!=b (4) a=a%b (5) a=a>b (6) a=a||b (7) a++ (8) a=!a (9) a+=b*2 (10) a=(++a)*(b++)
マルチすんなよボケ
(10)は未定義
stderr ってなんだよ stdinやstdoutは unko.exe < data.txt unko.exe > data.txt で、使えること知ったけどよ。 stderr ってなんだよ
unko.exe > data.txt とやっても、data.txtに書き出さずに、プロンプトにエラーメッセージを表示できる。
134 :
デフォルトの名無しさん :03/07/10 23:16
>>133 突然、変なこと聞くけど
unko.exe > data.txt
data.txtへリダイレクトしている内容を、Cのプログラムで直接受け取ることは不可能ですか?
int main(int argc, char **args){
unko.exe の出力をこの中でいじる!
}
135 :
マルチでごめん! :03/07/10 23:17
>>134 system("unko.exe > data.txt ");
data.txtを開いて読むというのは無しね。
どうしたいのかよくわからん。 リダイレクトはファイルへしかできない。 標準出力に出されたものを、標準入力から取り込むならパイプがあるが。
>>136 /* wget で取り込んだhtmlファイルをdata.txtという名前で保存する*/
system("wget
http://hanyan.co.jp -O data.txt ");
data.txtを開いて読む。
ということをやっていたプログラムをファイルの使えない
組み込みLINUXに移植することになりましたので、よい方法を探しています。
wget の出力を、C言語の中で、charの配列か何かで受け取る方法は無いかなあと。
共有メモリとかあるはずだが。
popen
unko.exe | hoge.exe
>>140 それだ〜〜〜〜〜っ!
ありがとう。ありがとう。
文字で図形を描こう 繰り返しを使い、三角形を画面に表示させましょう。ただし、表示する三角形の 高さをキーボードから指示するものとします。 高さが n の三角形を表示するには、 1行目ではスペースをn-1回表示し、アステリスクを1回表示 2行目ではスペースをn-2回表示し、アステリスクを3回表示 k行目ではスペースをn-k回表示し、アステリスクを2k-1回表示 という処理をn行目まで繰り返します。
□□□□□□□*↓ □□□□□□***↓ □□□□□*****↓ □□□□*******↓ □□□*********↓ □□***********↓ □*************↓ ***************↓ あとは、簡単ですからプログラムを作ってみよう。 応用編 □□□□□□□*↓ □□□□□□*□*↓ □□□□□*□□□*↓ □□□□*□□□□□*↓ □□□*□□□□□□□*↓ □□*□□□□□□□□□*↓ □*□□□□□□□□□□□*↓ ***************↓ にチャレンジしてみよう。
よろしくおねがいします。
>>143 しゅくだいは、じぶんでしましょうね。(いちおうひらがなでかいておきます)
>>144 >>1 > ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
>>101 sscanf()のパラメータが間違いだらけ。
受け渡し方としては、まぁいいんでないかい?
尤も、LENGTHとLENGTHLINEの値によっては問題あり。
>>101 ・sscanf()のパラメータが間違いだらけ。
・そもそもsscanf()の必然性が不明。
・LENGTHとLENGTHLINEを分ける理由も不明。
・fileもレゾンデートルが不明。
・a,b,cを読むたびにファイルを開きなおすのか? その辺も不明。
「具体的」と書く以上、もっとちゃんと元のソースを載せろよ。
元々おかしいのか、コピーの段階でおかしくなったのか判らないじゃないか。
LinuxでC言語を使ってMACアドレスを取り出すにはどうするの?
>>143-145 ここまでハッキリとアルゴリズムが示されていて、何がわからないと言うのだろうか?
C。
155 :
デフォルトの名無しさん :03/07/11 02:03
外部シンボル "__imp__timeEndPeriod@4" は未解決です 外部シンボル "__imp__timeBeginPeriod@4" は未解決です というエラーが出ます。 ちゃんと #include <mmsystem.h> をインクルードしてから、 timeBeginPeriod(1); を使っているのですが
>>155 それはリンクエラー
ヘッダーファイルをインクルードしたかどうかは関係ない。
winmm.libをリンクしたらいきました しかし、なぜMSDNで検索してもtimeEndPeriodは見つかりませんなんだ?
159 :
デフォルトの名無しさん :03/07/11 03:36
正常に動いていたプログラムを2つのファイルに分割しコンパイルしたところ、 次のようなエラーが発生しました。 codemlmain.c が main を含み、codemlwrap.c が関数 codemlwrap を含むファイルです。 read_control_file, get_num_of_trees などは codemlmain 内で定義し、 codemlmain ファイル内からのみ呼び出している関数です。 codemlwrap.c, codemlmain.c 内の関数のプロトタイプは codemlmain.h で 宣言し、codemlmain.c からのみ include しています。 codemlwrap.o: In function `read_control_file': codemlwrap.o(.text+0x554): multiple definition of `read_control_file' /tmp/ccIGiNsI.o(.text+0x0): first defined here /usr/bin/ld: Warning: size of symbol `read_control_file' changed from 897 to 893 in codemlwrap.o codemlwrap.o: In function `get_num_of_trees': codemlwrap.o(.text+0x8d4): multiple definition of `get_num_of_trees' /tmp/ccIGiNsI.o(.text+0x384): first defined here codemlwrap.o: In function `get_tree': codemlwrap.o(.text+0x978): multiple definition of `get_tree' /tmp/ccIGiNsI.o(.text+0x428): first defined here codemlwrap.o: In function `get_seq': codemlwrap.o(.text+0xa1c): multiple definition of `get_seq' /tmp/ccIGiNsI.o(.text+0x4cc): first defined here codemlwrap.o: In function `print': codemlwrap.o(.text+0xba4): multiple definition of `print' /tmp/ccIGiNsI.o(.text+0x654): first defined here collect2: ld returned 1 exit status 以上、よろしくお願いいたします。
>>159 オブジェクトファイルを二重にリンクしようとしてないか?
makefileなどを見なおしてみるように。
尚、これ以上はスレ違い。
>>159 1 ファイル内のみでしか使わない(staticな)関数の宣言は
そのファイルの頭で宣言する(ヘッダファイルを使用しない)
2 ファイル外で使う(externな)関数と変数の宣言は、ヘッダファイルにまとめ
その関数及び変数を使用する全てのファイルの頭で #include する
3 2で宣言した関数と変数は、全てのファイルの中で
必ず、1回だけの定義をする必要がある
>>160 別にスレ違いではないような…
>>162 リンク手続きの問題なら、コンパイル環境の使い方になるからスレ違い。
まぁ、あんたの指摘するような問題もあるからその点に関してはスレ違いではないな。
まだ Makefile とか書いていなくて、
gcc -c codemlwrap.c
gcc -o codemlmain codemlmain.c codemlwrap.o
としているだけなのですが、問題ありますか?
>>162 >>3 2で宣言した関数と変数は、全てのファイルの中で
>> 必ず、1回だけの定義をする必要がある
これは全てのファイルを通して、各関数が1回だけ定義されている必要がある、
ということですよね。
codemlmain.c, codemlwrap.c の両方で #include しましたが同じ結果になります。
んんー、特に問題ない気がするのですが・・・。
同一ファイル内からしか呼び出さない関数を全て static にしたら できました。お騒がせしました。 でも、これって static 付けなきゃいけないもんなんですか〜?
>>166 疑問があるなら調べろよ。
staticとは何か理解しているのか?
>>166 ソース晒してみ?
static宣言しなくても普通はコンパイルできるんだがな。
#ヘッダファイルじゃなくてソースをincludeしているに一票。
関係ないけど gcc -c codemlwrap.c gcc -c codemlmain.c gcc -o codemlmain codemlmain.o codemlwrap.o これと>165のは同じ意味ですか?
だから関数プロトタイプを勉強しろって。
>>170 なんとかの一つ覚え?
>>169 ほぼ同じ。
但し、
>>165 ではcodemlmain.oが生成されない。
つーのはgccの話であって、コンパイラによっては一概に言えない。
なるー
Cをはじめて3日目です。 平方根を求めるプログラムを作っているのですが、実行時にエラーになってしまいます。 コンパイル時の警告メッセージも意味がわかりません。 #include<stdio.h> #include<string.h> #include<math.h> /*平方根を求めるプログラム*/ intmain() { char*i; intl; doublej,k; for(l=0;l!=EOF;l++) { printf("数値を入力してください。\n"); gets(i); i[strlen(i)-2]=NULL; j=atof(i); k=sqrt(j); printf("平方根は%fです。\n",k); } return0; }
174 :
デフォルトの名無しさん :03/07/11 16:48
>>173 sageているし、ネタだと思っていいのか?
iはどこを指しているの?
>>173 あえて言おう!
> 平方根を求めるプログラムを作っているのですが、
君が作っているのは平方根を求めるプログラムを使うプログラムだ!
gets(i); i[strlen(i)-2]=NULL; j=atof(i); scanf("%d", &j);
>>173 char* i; → char i[128];
i[strlen(i)-2]=NULL; → 不要
179 :
デフォルトの名無しさん :03/07/11 19:41
こんばんわ。 ちょっと質問させてください。 12bitの整数型を使ってmalloc()で領域を確保したいのですが どうすれば12bitの値を扱えるのでしょうか?
180 :
デフォルトの名無しさん :03/07/11 19:43
int12 *p; p = malloc(sizeof(int12));
184 :
デフォルトの名無しさん :03/07/11 19:51
185 :
デフォルトの名無しさん :03/07/11 19:53
swprintfとか載ってねーな
>>184 今の自分にはこれで十分そうです。
ありがとうございます。
>>180 ビットフィールドって7bit以上でも使えましたっけ?
>>181 Linux上でgccを使ってるのですが、
コンパイル時にint12で弾かれてしまいます。
どうしたらいいでしょうか。
>>182 12bitは決定で変えられないんです。
>>187 12bitの整数を扱わなければいけないのはなぜ?
何をしようとして必要なんだ?
>>188 画像処理で使うのですが、
機械の都合でピクセル毎の輝度が12bitで与えられるからです。
C++でclass Int12を作って、それを使うとか。
>>189 演算は32bitで行って、必要なときに12bitにつめればいいんでないの?
>>187 何だかよー分からんが、
例えばフロッピーディスクの FAT のように、
12 ビット長の値の羅列を扱う必要があるって状況なわけね?
12 ビットの型を用意することはできないので、
(ビットフィールドを使っても、
その構造体のサイズはバイト単位になってしまう)、
8 ビットの配列を使って、
それを 12 ビットの配列であるかのように扱うしかない。
例えば、char a[3]; とすると、CHAR_BIT が 8 だとすると
((int)a[0] << 4) | (a[1] >> 4) と
((int)a[1] & 0x0F) << 8 | a[2] を
第 0, 1 要素として扱うわけだ。
それって12bitしか使わなければいいのでは?
195 :
デフォルトの名無しさん :03/07/11 20:38
>>187 あれってひとつのメンバーに割り当てられるのは6ビットまでなの?
ビットフィールドじゃ解決にならないってば
>>189 12bitで画像処理ってIKONOS画像か?
算術演算のみでビット演算しないんだったら32bit整数で間に合うと思うけど。
>>190 C++は全く齧ったことがないのですが、ちょっと調べてみます。
>>191 12bitの値を32bitの型で受けるんですか。
やってみます。
>>192 >12 ビット長の値の羅列を扱う必要があるって状況なわけね?
はい。その通りです。
ちょっと難しそうですが、例に挙げていただいた通りやってみます。
>>193 12bitしか使わなければいいっていうのは
どういうことでしょうか?
>>197 算術演算のみです。32bitで間に合いますか。
ちょっと考えてみます。
>>196 それなら191も駄目ってことになるけど。
具体的にはその12bit整数配列に対してどういう処理が必要になるの?
12bit のintを使おうとせずに、12bitデータが入ったデータ領域に対して処理をするような関数を作っていったほうがいいと思われ。
12bitなのは輝度だけなの?
>>203 はい。
他の要素(サイズとか圧縮方式とかメモとか)は
ヘッダーに格納されていて、別の関数で取り出します。
答えになっていないと思う。
>>199 なんでやねん。
ビットフィールドと、ビット演算は違うぞ。
そもそも、ビットフィールドって互換性がぐちゃぐちゃだから、外界とのやり取りにはつかえないし。
(まあ、ビット演算の方もエンディアンの問題が歩けど。)
>>205 失礼しました。
12bitの配列は輝度だけです。
RGB+1の合計4つの12bit整数で1ピクセルができます。
208 :
デフォルトの名無しさん :03/07/11 21:37
int12arrを12ビット整数の配列のポインタ
idxを取り出したい12ビット整数の配列のインデックス
として、以下の関数でデータを取り出す。
int GetInt12(unsined char* int12arr, int idx)
{
int int12;
if (idx%2) {
int12 = array[3*idx/2]<<4 + array[3*idx/2+1]
>>4 } else {
int12 = array[3*idx/2+1]<<8)&0x00000f00 + array[3*idx/2+2]
}
return int12;
}
速度が気になるならマクロかinline関数にする。
>>202 ソース見せられても困るんだけど。
そうじゃなくてさ、int12の配列に対して具体的に何がしたいのか。
indexで要素を取り出すとか、
指定範囲を取り出すとか、
指定範囲に書き込むとか、
コピーするとか、移動するとか。
そういう風に必要な処理を作って、それらを使って最終的な目的を果たせばいいでしょ。
おっと、取り出せばいいって言ってるか。
じゃぁ、
>>208 で解決?
>>208 サンプルコードまで書いて頂いて、ありがとうございます。
参考にさせて頂いてしっかり身に付けたいと思います。
>>210 はい。解決です。
長々とお騒がせしましてすみませんでした。
レスして頂いた方、ありがとうございました。
とても勉強になりました。
ビット演算してる最中にエンディアンでハマるようなトロいやつはシスプロに向かん
エンディアンの確認を忘れてハマルことはたまにあるな。
>>212 ビット演算してる最中にエンディアンではまるなんてことがあると思ってる奴は、プログラマに向かん。
エンディアンではまるのは、外部とのやり取りか、変なキャストをした時だけだろ。
外部とのやり取りか、変なキャストをするときだけ特別なのか、あんたは
>>215 はぁ ?
それ以外で、エンディアンではまる例をあげてみなよ。
だからハマんねーつってるだろ
とっても恥ずかしーバグ出して欝な香具師同士で傷のなめ合いでもするスレかここは
>>217 なんだ、日本語できないクンだったのか...。
エンディアンではまる (可能性がある) のは、外部とのやり取りか、変なキャストをした時だけだろ。
課題1:3科目(英数理)の点数をキーボードから入力して、それらの点数のうち最も高い点数を表示するプログラムを作りなさい。 自分が作ったのは下のです #include<stdio.h> main() { int eng,math,sci,max; printf("英語の点数--->");scanf("%d",&eng); printf("数学の点数--->");scanf("%d",&math); printf("理科の点数--->");scanf("%d",&sci); if(eng>math){ if(eng>sci){ max=eng; } else{ max=sci; } } else{ if(math>sci){ max=math; } else{ max=sci; } } printf("最高点は%d点です\n",max); } でもどうやら「関数」構造でなければならないらしいのですが、その時の講義に法事の為出席できなくて関数がわかりません。 本も読んだのですがプロトタイプが必要とかそれくらいしか理解できなかったです。 基礎論なので難しい関数は使わないはずです。void return ansとか本に書いてあります。 他のスレにも書いたんですが、レスないのでお願いします。
>>219 うっせえ、日本語以前にC言語できないクソにタメ口たたかれる憶えはない
いつまでもてめえのスキルを当然だと思っていろヘボ
>>220 その程度なら特に関数はなくても困らないけど、
まぁ関数作るとしたら
3つの値を引数にとって、その中の最大値を返す関数
を作るかな。
int max(int eng, int math, int sci)
{
/* 中身は自分で考えてちょ */
return ans;
}
こういうの作って、
printf("最高点は%d点です\n",max(eng, math, sci));
こういうことする。
数学の関数と同じで、関数は引数をとって、結果として値を返す。
その値は数学と同じ様な格好で使う。
printf も scanf も main も関数だし、
それが使えてるなら特に難しいことはないと思う。
あと、main の最後では return 0; を忘れずに。
ちなみに220はマルチです。
>あと、main の最後では return 0; を忘れずに。 voidがない処理系だろ、そんくらい嫁
>>221 > タメ口
彼には、あれがタメ口に聞こえるんだ...。
好意的な解釈する奴だな。(藁
>>225 おいエンディアン、反論できないと自作自演かw
で。答えは何なの?
エンディアンではまるやつはバカ
ご丁寧にありがとうございます。 せっかく教えていただいたのに答えがわかりません。関数なしのプログラムが僕の精一杯なのかも… 223さん、マルチってどういった意味でしょうか? 224さん、それはどういうことですか? なんだか聞いてばかりでごめんなさい。お願いします。
エンディアンうそつかない。
ハオハオ
>>223 > 他のスレにも書いたんですが、レスないのでお願いします。
>>224 main() だから戻り値の型は int だろう。
>>225 8〜23行目をコピペして max → ans にして、
int ans; をつければ終わりだよ。
>>232 >main() だから戻り値の型は int だろう。
そうだよ。それを百も承知で国家する場合を知らんらしいな。
国家する?
ねむ。。。漏れもそろそろ国家するぞ
国家とリス
C++ では main の return 0; を省略することは規格で許されている。 C では main の return 0; を省略することは規格で許されていない。
そんな役所気質な...
>>226-228 わかりやすい、自演ありがとう。
で、君は何に反論して欲しいんだ ? (藁
真実はいかに?俺はどっちでもいいんだけど
キャストに変も糞も無いと思うけど?
>>232 レス遅くなってすいません。
どうもありがとうございました。
良い人ばかりで嬉しいです。
あーなんか喧嘩になっとる。。。
>>206 互換性がぐちゃぐちゃ?12bit割り当てたつもりが実際はそれ以上割り当てられることもあるとか?
>>242 はぁ ? 腐るほどあるけどな。
まあ、出会ったことないなら、それに越したことはないよ。
>>244 それに加えて、MSB/LSB のどっちからビットを割り当てるとかがぜんぜん決まってないよ。
>>214 が書いてる通り、キャストや外部とのやり取りしないなら問題ないけどな。
>>245 この場合はどちらから割り当てるかってのは関係ないと思うけど、「それに加えて」ということは244で言ったことがありえるの!?
あー、関係ないと言ったのは例えばbitfield.member=12345;とやった時(12345を受けるだけの大きさを持っている)、 ビットパターンがどうであろうとbitfield.memberの値は12345でしょ?ということ。
>>242 int a = 0xFF000000;
*(char*)&a はなーんだ?
>>245 あんた、何の為にキャストすんの?
ある型を無理矢理、他の型に変換する為に必要だからじゃないの?
それとも、何か他に笑えるキャストがあるとでも?
くだらん! おまえのはなしはくだらん!
>>248 int a=1;にしろよ。0xFF...が入らないという問題も起こりうるだろ。
くだらない事で議論するな。この、方形ヤロウども!!
例えば、速度重視の場合でアライメントが16bitだったとしよう、 で数パターンしかない情報が3つと、フラグが1つの情報が絶対に必要。 そうしたら、普通は1-5-5-5bitで16bit内に情報を詰めると思うんだけど? 勿論キャストなんてしないしですが、エンディアンとやらは問題になりませんか? 値セットや値を取り出すとき。<<>>
>>251 これって、ソフト的なエンディアン判定に使えるんだよな。
>>253 [0] [1]
とデータが入っていると、
リトルエンディアンの場合
[1] << 8 + [0]
が 16 ビット値になる。
ビッグエンディアンの場合
[0] << 8 + [1]
が 16 ビット値になる。
>>253 ならない
が、通常、そのデータを外部に保存する必要がある為
その時にエンディアンが問題となる
>>255 シフトでしょ
x <<>> = 6; とか出来たらちょっと便利かも。
>>257 まったくもって訳わからんよ?
何故、値を保持する目的のデータを外部に
ま・た・保持しなおすの?
よっぽど外部以外の事にしたくなんだね。
>>259 どう言う値が入ると便利だと思ってるの?
>>262 上位nビットをクリアするときとか。
nが変数のとき
x <<>> = n; で上位 n bitクリアできる。
ようするに
x <<= n;
x >>=n;
エンディアンのことは何にも考えてないので突っ込まないでね。
>>261 >>253 が言ってる事は
typedef short i16 ; /* short は16bit */
typedef struct { char flag ; char data[3] ; } info ;
これを、キャストを使わずにシフトとビット演算のみで
infoの値をi16にセットしたりi16からinfoの値を取り出す事で
エンディアンとは全く関係ない
>>263 関係あるのはエンディアンでは無く算術シフトやね
>>264 で、リトルエンディアンとビッグエンディアンで
同じコードで問題無いの?
どっちにシフトするの?
って話じゃないの?
>>268 あ、俺は261じゃないよ。ずっと見ているだけだった。
もしそうならエンディアンは関係ないなぁ。
関係あるのはファイルに書き出すときと読み出すときだな。
>>269 int i = 257 >> 1 ;
この結果がエンディアンで変わるとでも?
>>270 メモリでもエンディアンは問題になるが?
>>272 ファイルからの読み出し時と書き出し時にバイトオーダーを統一する処理をするだろ?
>>274 はぁ?
Bit処理って書いてあるだろ?
>>267 こうだ!
x &= ~0 >> n;
俺って頭いい〜。
今日は、とても芳ばしい香具師がいるようで…
ネットワークでのhtonlやntohlみたいに。
>>275 x &= ~0u >> n;
符号ありで符号が残されるかどうかは未定義だけど、
符号なしなら符号ビットは残されない...よね?
>>279 xを符号なしにキャストすれば
~0uも符号無しの演算になると思う…
で、リトルエンディアンとビックエンディアンで bit = 1;//ビットのつもり bit << 6;//6ビット目 valure | bit;//セット 見たくセットして問題ないの? 例えば、マスク処理とかで valure & 0xf0;//上位ビットが欲しい なんて場合でも?
良く考えたら、やっぱり、駄目やね…
>>282 >bit << 6; /* 6ビット目と言う表現は別にして */
問題ない
ただし、ファイルから読み込む時、ファイルに吐き出す時は要注意
>>282 キャストがなければ大丈夫。
intをキャストでcharに分割したときとか、その逆とかで問題が起きる。
0xf0でマスク取ってるのは問題にならないの?
>ただし、ファイルから読み込む時、ファイルに吐き出す時は要注意 は、この場合、全く関係無かったから、無視してちょ
>>287 対象のエンディアンが変われば、マスクのエンディアンだってかわるっしょ。
>>289 だから
valure & 0xf0; /* 上位はエンディアンに関係なく上位だ */
エンディアンを考慮しなければならない時は
(異なるエンディアンの)ファイルをバイト単位で読み込んで
そのまま、何もせずに、マスク処理をほどこす時
そりゃ違うフォーマットのデータだものな。
>>292 書き込んだ直後に気付いたけど
>>287 の答えとしては、少し不適切だから
そのままでも良いかと思わなくもなかったり…
まぁね。
295 :
教えてください :03/07/12 08:05
/*InputTest.cpp*/ #include <stdio.h> #include <string.h> #include <conio.h> char *ary[1000]; void test(); void main() { test(); printf("\n\n"); } void test() { char c; int i=0; do{ printf("\nEnter string: "); char s[256]; ary[i] = gets( s ); printf("You typed: %s", ary[i] ); i++; printf("\n\t****Press any key to continue or quit to press (q)**** "); c = getch(); }while( c != 'q' ); printf("\nHere:\n"); for( int j=0; j < i; j++ ) printf("\n%s", ary[j] ); }
上記のコードだと全て、最後のインプットのみになってしまいます。 本来なら、 dog cat bird となるはずですが、どなたか原因が分る方教えてください。 Enter string: dog You typed: dog ****Press any key to continue or quit to press (q)**** Enter string: cat You typed: cat ****Press any key to continue or quit to press (q)**** Enter string: bird You typed: bird ****Press any key to continue or quit to press (q)**** Here: bird bird bird Press any key to continue
補足です。本来なら dog cat bird となるはずなのに、 bird bird bird となってしまいます。なぜでしょうか?どなたか原因が分りますか?
300 :
デフォルトの名無しさん :03/07/12 08:17
>>297 s[256]はループするたびに書き換わる。
aryにはその領域へのポインタしか入れないんだから、常に最後に入力したものが表示されて当然。
>>300 ありがとうございます。早速
char s[256];
をループの前、にもっていきましたが、結果はおなじでした。
そのあと、グローバル・バリアブルにしましたが、やはり、
結果は同じでした。
>>303 ポインタに慣れていないので、今の自分にはそれが精一杯です。
しかし、charのポインタのアレーを使うことが条件なのです。
>>305 要するに配列のインデックスをインクリメントしても、全てのインデックス
を指してしまうのでしょうか? インデックスごとに違うものをさすことは
不可能なのでしょうか?
>>306 sを二次元配列にするなどして、ループするごとに違う領域に書き込むようにすればよい。
今のままでは大勢で一人を指さしているようなもの。
ary[i] = gets( s ); を ary[i] = strdup(gets( s )); にでもしろ。 >しかし、charのポインタのアレーを使うことが条件なのです。 宿題なら余所いけ。
>>305 char *c[] = {"dog", "cat", "bird" };
for( int i=0; i < 3; i++ )
printf("%s", c[i] );
このようにテストした時は、ちゃんと大丈夫だったのに。
どうすれば、キーボードのインプットをそれぞれのインデックスに
アサインできるのでしょうか?
>>308 ありがとうございます。strdup というファンクションは私の5冊の本の
いずれにもでてないので、知りませんでした。感謝します。
>>307 ありがとうございます。2D配列を使いたいのですが、ポインタの練習
なので、それはだめとのことです。Javaのように簡単ではないですね。
ことでそ。
ところで、
>>295 でコンパイルが通るということはC++としてコンパイルしているんだな。
それと、よく見たらs[]ってブロックを抜けているじゃない・・・
たまたまデータが消えずに残っていたんだな。
>ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
あれ?ブロックを抜けた後じゃなくて関数から抜けたあとだっけ? 自動変数が消滅するのは。
>>313 ブロックでしょ、
たまたま、毎回同じ所に確保されてるっだけかと。
>>311 >それと、よく見たらs[]ってブロックを抜けているじゃない・・・
すみません、この意味をおしえてください。
>>312 今回は知らなかったけど、次からそうします。
>>315 ブロック(ここではdoの)を抜けた後にブロック内で定義した自動変数sを、ブロックを抜けたあとにポインタを介してアクセスしてもいいのかどうかと・・・・
勘違いしていることがあるかもしれないので自信ない。
朝っぱらから書き込み激しいな
少なくともsという名前にはアクセスできないけど、その領域はどうだったかなぁと。
>>314 さんはブロックを抜ければその領域は不安定なものになると言っているけど。そうなるのは関数を抜けたあとかもしれないので。
厨房キター! 延髄反射で質問を返してきまふ。
延髄かよ
>>316 sはループの中のみと思ったので、ポインタが絡むとそこまで気を
つかわなければいけないんですね。ありがとうございました。
>>317 こちらは今、金曜午後8時です。
とりあえず解法としては sを2次元にしてary[i]=s[i];とするかmallocしかないと思うのだがどうか? dog,cat,birdしか入力されないとわかってるならほかにもあるが。
>>319 申し訳ない。
こんなこと考えたこともなかったもので。自動変数のアドレスを返すというのは考えたことがあるんだけど。
イメージとしてはループするたびs[]をつくるんだから、毎回消えるとも言えるか。
じゃあ
>>314 さんの言うとおりでいいのか。
つまりだ、
>>295 はスレ違いの質問をしているわけだ、と。
>>299-324 は釣られてしまった、と。
阿呆な回答なんかしてるんじゃね、と。
>>295 宿題丸投げなら宿題スレへ行け、と。
C++の質問したいならC++スレで叩かれろ、と。
Cで書きたいならはじめからファイル名が間違っているぞ、と。
327 :
デフォルトの名無しさん :03/07/12 11:05
HP-UX11iのHP Cですが、oracle9.2.0のライブラリをリンクしたCプログラムで dirname()関数の動作が異なってしまいます。 cc -o test1 -L/oracle/app/oracle/product/9.2.0/lib32/ -lclntsh test1.c 通常は、dirname()の引数で指定してパス名文字列が書き換わることはないですが、 上のコマンドラインでclntshをリンクした場合、dirname()の引数に指定したパス名 文字列からファイル名が削除されてしまいます。 (dirname()のリターン値が示す文字列と同じになる) 何かご存知ないですか?
>>327 >何かご存知ないですか?
知ってる。しかしスレ違いなので書かない。
米オークションサイトのeBayのツールを日本語化しています。 Resource Hackerで日本語に置き換えているのですが文字化けが発生してしまいます。 日本語化のサイトを見て回ったのですがこのソフトのタイプの対応例が無く、 どのリソースの始めの部分にも STRINGTABLE LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US が書いてあったので検索しました所、 かろうじて英語で表示しろという命令らしい?事がわかりました。 fontの指定するリソースが無いので上記の文章で 英語として表示させている?と思うのですが、 これをどのように置き換えれば日本語が表示されますでしょうか? どなたかお教えいただければ幸いです。
C++マンセー
C++はウンコカス
333に反応するやつはさらにカス
336 :
デフォルトの名無しさん :03/07/12 19:25
一通りCの基本はできるようになったんですが、 次に何をしようか悩んでます。 APIの使い方を覚える? それとも、SDKでも覚えてWinアプリ作成?
338 :
デフォルトの名無しさん :03/07/12 20:01
339 :
デフォルトの名無しさん :03/07/12 20:02
340 :
デフォルトの名無しさん :03/07/12 20:09
TCHARとはなんでしょうか?
先生
342 :
デフォルトの名無しさん :03/07/12 22:49
関数の中に関数を作る方法を教えてください。
343 :
デフォルトの名無しさん :03/07/12 22:58
>>343 わざと吊られたんだろ?そうだよな?そうだと言ってくれー!
346 :
デフォルトの名無しさん :03/07/12 23:05
>>340 これです。
#ifdef UNICODE
typedef WCHAR TCHAR , *PTCHAR ;
#else
typedef char TCHAR , *PTCHAR ;
#endif
charやWCHARでなくてTCHARを使っていれば、文字コードが
ワイドキャラクタ環境でもマルチバイト環境でもソースの変更
の必要性がなくなる。
はなっからワイドキャラクタ(=UNICODE)を想定してなければ
charで十分。
347 :
デフォルトの名無しさん :03/07/12 23:10
初歩的な質問なのですが、gccのオプションの-cってどんな意味があるんでしょうか?
>>342 C++ なら工夫すれば作れるんだけどなぁ。
ローカルクラスの static メンバ関数にすれば。
350 :
デフォルトの名無しさん :03/07/12 23:13
>>348 コンパイルのみでリンクしないと書いてあるのですが、
リンクしないという意味がよくわからなくて。。。
同じこと考えてる奴がもう一人いたか。。
352 :
デフォルトの名無しさん :03/07/12 23:14
>>347 オプション -o はなんですか?これがヒント。
353 :
デフォルトの名無しさん :03/07/12 23:16
>>350 オブジェクトファイルをつくって終わり?
354 :
デフォルトの名無しさん :03/07/12 23:18
もうちょいヒントをください
>>354 とりあえず本でも買って読めよ、
金が無いなら図書館に行けばあるだろう。
大抵の本に書いてある。
こんな事くらいで聞いてるくらいじゃ、この先ずっと聞きっぱなしか?
>>354 ここは初心者質問スレじゃねーんだよ、かえれ!
357 :
デフォルトの名無しさん :03/07/12 23:25
>>354 a.c -> a.o
b.c -> b.o
a.o+b.o+etc -> a.out
上2行がコンパイルで最下行がリンクです。
358 :
デフォルトの名無しさん :03/07/12 23:27
>>354 なぜこんなオプションがあるかというと。
たとえばオブジェクトライブラリを作るときに便利だからです。
>>346 ありがとう
どこのヘッダーにその定義があるのでしょうか?
windows.hかな?
>>345 いえ、わざとではありません。
釣られてもないです
364 :
デフォルトの名無しさん :03/07/13 00:24
>>349 はぁ ? もうちょっと具体的に書いてくれると、もっと笑えると思う。
これじゃあかんのか? void f() { struct Inner { static void foo() { std::cout << "foo()" << std::endl; } }; Inner::foo(); }
369 :
デフォルトの名無しさん :03/07/13 00:42
つまらん質問ですがおまいら聞いてください。 "C" はなんで "C言語" と言うのでしょうか!? Fortran COBOL Pascal BASIC "言語" ってつけるとなんか変に聞こえるんだけど。
石田先生の訳に準拠 以上
俺は C と呼ぶことにしているがな。
>>369 漏れもCダケで通じるときはCだぞ。
逆に他の言語も後ろに言語って付けることがないとは言えないな〜。
みなさん すぃ〜 ですか。よかった。なんか周りが "しーげんご" という人ばっかりで。 ( "しー" じゃないですよね… )
でも、イパーン人に対してだけは C 言語って使うな。 C だけだと通じないことが多いだろうし。
>>376 へへぇ〜!
顔あらっておととい来ます。
みなさんどもでした!
379 :
よし@C++ :03/07/13 01:47
英語・国語・数学の点数を入力して、それらの点数のうち、どれか一つでも90点以上であれば“合格”、 または平均点が60点以上であれば“合格”と表示するプログラムを、関数構造を使って作成せよ。 という課題がでたんですが、正直全然わかりません。基礎論の授業の前期テストなんでホントは簡単なはずなんですが… 勉強がたりなかったようです(:_;) どなたか教えていただけませんか?
380 :
デフォルトの名無しさん :03/07/13 01:47
C++かこっちか迷いましたがここに書きます func().a; こういう風にできるらしい びくーりしたーよ
381 :
デフォルトの名無しさん :03/07/13 01:48
>>379 名前から見ると C++ の質問か?
C++ はスレ違いだぞ。
まぁ、確かにそれは C で十分なわけだが。
そういや、何か上のほうでもちょっと違うけど似たような質問があったなぁ。
点数を入力する関数、
どれか1つでもある点数以上であれば真を、さもなくば偽を返す関数、
平均点を返す関数、
の3つを作ればそれでええんでないかな(main 除く)。
>>380 C++ なら普通に使う。
まぁ、最初は違和感があるやもしれん。
俺もそうだった。
384 :
よし@C++ :03/07/13 02:03
>>382 スレ違い申し訳ありません。失礼しました。
CとC++の違いも分からないような素人なので。以後気をつけます。
>>383 点が見えずらいかもしれんが、
こんな感じ
struct AAA func();
で、構造体AAAがfuncから帰ってきたから、AAAのメンバにアクセスすると
C++だけどね
>>383 戻り値が構造体なら
そういう風に使うこともあるってことさ。
*func(); こうやって戻り値を間接参照するってのもあまりやらないな。
非 const な参照返しなら func() = 0; てなことも。 まるで関数に代入しているよう。
C++ なら func()->foo(); ってこともするけどな。
参照なんてCにはないじゃん
393 :
デフォルトの名無しさん :03/07/13 08:03
394 :
デフォルトの名無しさん :03/07/13 08:14
#ifndefと #if !definedって 何が違うんでしょうか? 親切な方教えていただければ幸いです。
Cだと構造体へのポインタを返して func()->a の方が多いかな? でも、 func().a も小さい構造体や共用体を返すときには使うよ。
396 :
デフォルトの名無しさん :03/07/13 08:28
MFCとSDKって何が違うんですか? 普通Windowsアプリを作るときはどちらを使いますか? 言語はどれを使ったらいいんですか?
>>394 歴史の違いもあるけど、
#if defined(MACRO1) && defined(MACRO2)
って使い方ができるようになった。
#ifdef/#ifndef
だけだとこういうことはできない。
399 :
デフォルトの名無しさん :03/07/13 08:38
>>397 そうだったのか・・・ Σ(゚Д゚;
漏れの勉強不足でした・・・
>>397 &&なら
#ifdef MACRO1
#ifdef MACRO2
〜〜〜
#endif
#endif
これでできると思うけど。
|| だとちょっとね。
405 :
デフォルトの名無しさん :03/07/13 13:30
0〜100までの数をランダムで取得して、 それを表示したいんですが、どうやって乱数を 発生させたらいいですか?
>>405 こんな所で聞くより、googleで検索すれば瞬時に分かるんだが。
>>394 #elif の場合は、
#elifdef, #elifndef ってのがないから、
defined ってのがどうしても必要になる。
409 :
デフォルトの名無しさん :03/07/13 13:39
int a=rand(1^100); printf("%d",a);
410 :
デフォルトの名無しさん :03/07/13 13:47
なぜ俺はこんなに天才なんですか?
そんなこともわからないようじゃ天才とは言えんな
414 :
デフォルトの名無しさん :03/07/13 14:12
>>413 ここが2chだと言う事を忘れるな。
天才→天災
415 :
デフォルトの名無しさん :03/07/13 14:40
WinMainが未解決ってどういうことですか?
迷宮入り
>>404 とりあえず、
#ifdef MACRO1
#define MACRO1OR2
#endif
#ifdef MACRO2
#define MACRO1OR2
#endif
#ifdef MACRO1OR2
〜〜〜
#endif
ぐらいか。
>>408 ネストすればいいだけだろ。
#ifdef xxx
〜〜〜
#else
#ifdef yyy
〜〜〜
#else
〜〜〜
#endif
#endif
>>413-414 下らん餌に食いつくなよ。
大学の参考書だけでは足りないので、本屋で違ったのを買おうと思って いるのですが、どの参考書がいいでしょうか? この参考書を使っているがいいというのがあれば教えてください。
Mainと書いたらコンパイルエラーがでますた。
感じない日々を補うための映画ならば泣けるのに
>>421 そんなコンパイラは捨てろ。
普通は、リンクエラーだ。
なぜ俺はこんなに最強なんですか?
427 :
デフォルトの名無しさん :03/07/13 17:12
すんません、簡単な質問なんですけど 現在コンパイラはccを使ってます。 一般的にccとgccってどっちが早いんでしょう? どっちのほうが使ってる人多いんでしょうか? ネットで検索かけてもよくわかりませんでしたので どなたか教えてください
cc はコマンド名。 Solaris だったら Sun C Compiler だろうし、 他のハード/OS なら gcc の別名かもしれない。
cc はユーザーフロントエンドだっけ? ccはgccを呼んでいるから、直接gccを呼んだほうが早いんちゃう?
単なるエイリアスか。 ならいっしょかな。
>>427 ちなみに使っているのが多いのはgccだろうな。
>>428 の理由で ccが動く処理系よりもgccの動く処理系のほうが多いから。
みなさんレスありがとうございます。 これからはgccを使っていこうと思います。
エイリアスというかシンボリックリンク。
なぜ俺はこんなに最狂なんですか?
printfの魅力にとりつかれたから
たまには保守しとこ。落ちたらいやだし。
>>427 質問が不正確だぞ
プログラミングでは「早い」と「速い」を使い分けろ
それから翻訳速度と実行速度のどっちを問うているのかも
いいか、『ものすごく』重要だ
おまえがそもそもプログラミングを学ぶこと自体の意義にかかわることだ
人が多いかどうかはゲスな問題だ
おまえは世の中の何の役に立ちたいんだ?
もしかして、究極に残酷な問題が根底にあるかも知れんぞ
キモイ
コワイ
てか、無茶なことを言っている
>>429 への
ツコーミは禁止なんですか?
スレ違いだから禁止
究極に残酷な問題が根底にあるから禁止
443 :
デフォルトの名無しさん :03/07/13 23:51
LPDWORDって、unsigned long* だったんですか? int型のポインタ渡そうとしたら起こられましたけど
444 :
デフォルトの名無しさん :03/07/13 23:53
unsigned long far* とみた
>>444 windowsスレのほうですか?
お邪魔しました
447 :
デフォルトの名無しさん :03/07/14 00:11
環境依存質問なんですが、cygwin + g++ 3.2 で malloc で 1420 バイトまでしか確保できないんです。 それ以上確保しようとすると Segmentation fault します。 (C++ の) new char[] でも同様で例外さえ投げずにコア吐きます。 そこまでにヒープを明示的に使っている個所はなく、 メモリが足りないとは思えません。また malloc やメモリアロケータを 置き換えたりもしていません。 何故こんな事になってしまっているのでしょうか?
int型の"ポインタ"と言っているな。見間違えた。見当違いなレスをしてしまった。
>>447 mallocを呼ぶとセグメンテーション違反?
信じられないな・・・
環境を書くのを忘れていました。 80486でメモリは1Mです。
追記です。 malloc(1420) の直後に malloc(1) としても駄目です。 はじめから malloc(1421) でも駄目です。 挙動としてはメモリ不足にも見えなくはないんですが それなら 0 が返ってきますよね?
>>451 malloc(1421)とだけ書いたコードでもそうなるの?
>>450 それなら理由もわかるんですが…。
本当は 8086 で 640k ですた!
なんちゃって、本当は P4 で 1024M です。
>>447 実際にエラーを起こす、出来るだけ簡単なコードを晒してみそ
>>452 はい、
>>451 で書いた感じになります。
1420 単体は OK で、はじめからそれ以上でも、
その後に追加でも NG です。
#include <stdlib.h> int main() { malloc(1421); return 0; } これだけでセグメンテーション違反・・・・やっぱり信じられない。
バッファーオーバーなんとやら? どっかでメモリをおかしな状況にしてるとか?
>>456 ちゃうやろ
そこまでにとかいているから、他の処理部分もあるんやろ?
でなきゃやってられねーぜアニキ
>>458 452の質問に「はい」と答えているから・・・
>>454 晒そうと思って簡単なコードを書こうと思い、
>>456 さんの書いたコードと同じ物で試したら大丈夫でした。
というかバリバリ平気で 10メガくらい普通に確保できてるみたいです。
でよく考えたら stdlib.h インクルードして中田のですが、
恐ろしいことに windows.h に宣言が入っているみたい…
大丈夫だった時はライブラリを指定しなかったのですが、
これはリンクしてるライブラリを疑うべき状況でしょうか?
そういえばうちの環境だとwhile(malloc(1))とやるとそのうちkillされるな。 NULLが返る前に。
gcc のコンパイルに失敗してたり?
>>461 なら確保した領域の扱い方に問題がある可能性が高い。
きっとどこかでうっかりミスしていると思うよ。
>>461 君の全く別の部分のコードを疑うべき!!
多分変なところのメモリを書き換えちゃってる。
>>447 gccなら↓にチャレンジ♪
#include <stdlib.h>
int main()
{
int i=1421;
char buf[i];
return 0;
}
なぜ書き込みがない?
>>464 まだヒープから確保したものを使ってないんです。
そろそろスレ変えるべきかもと思いました。
こちらの説明にもだいぶ Windows SDK 色がでてきたので…。
>>456 さんの指摘する通りのメモリ破壊の可能性を探ってみて
その可能性もないと判断できたら Windows API系のスレに再度質問しようと思います。
みなさんありがとうございました。
>>468 WinのAPIじゃなくてgccのスレの方が良いと思うが…
ハゲ同 この場合、APIは関係ない
>>469-470 そうみたい…。
問題があると思っていたDIB取り扱い部分を切り離して
メッセージループ付近で
単純に1メガ確保→直後に解放
のコードを書いただけで駄目だったっぽいです…。
gcc のライブラリってヒープ足りなくなったらって自動的に OS から追加確保してくれないんですっけ?
>>471 自動的にヒープを追加してくれる OS の存在を、私は知らない。
って、ちょっと話の内容を勘違いしたかも。
(・д・) Cってまだ現役なんだなあ...とこのスレ見て感動
ダマレコゾウ >(・д・,,)
関数の最後で、よくポインタ変数をインクリメントしているのを見るんですが これはいったいどんな役割があるんですか?
void sample(char **x, int *k, int n) { while(n-- >0){ switch(**x){ case '0': sscanf(*x+1, "%o", k); break; case 'x': sscanf(*x+1, "%x", k); default: sscanf(*x, "%d", k); break; } x++; k++; } } xはmainで読み込んだ文字列。 nは読み込んだ文字列の数です。 文字列の先頭の文字によって読み込む進数を変えるプログラムです。
スペースがちゃんと適用されてない・・・見えづらくてすいません。 しかもsage忘れた(;´Д`)
>>479 関数の最後ではないではないか。
ループをひとつ回る毎にxとkを進めてるだけで、
つまりは次の文字列(x)とその文字列の数(n)を処理するようにしてるってことだ。
>>478 ループカウンタを用意してやった方が分かりやすいと思うがなぁ。
void sample(char **x, int *k, int n)
{
int i;
for(i = 0; i < n; ++i) {
switch(x[i][0]) {
case '0':
sscanf(&x[i][1], "%o", &k[i]);
break;
case 'x':
sscanf(&x[i][1], "%x", &k[i]);
break;
default:
sscanf(x[i], "%d", &k[i]);
break;
}
}
}
void sample(char **x, int *k, int n) { int i; for(i = 0; i < n; ++i) { switch(x[i][0]) { case 'x': k[i] = strtol(&x[i][1], NULL, 16); break; default: k[i] = strtol(x[i], NULL, 0); break; } } }
while(n-- >0){ これってwhile(n--){でいいよね。
よくない。
nはintだから負の場合もある
>>485 なんで?nの初期値が負だった場合に違いが出るから?
やっぱり・・・ 「読み込んだ文字列の数」なのに負の数を渡す方が悪いと思うけど・・・
カウンターコードというやつじゃよ。
>>488 例えば君が仕事として関数を作り、それをDLLとして提供したとしよう。
たまたま実行中に引き数が負になる状況が発生したら、
そんな暢気なことは言えなくなるのだよ。
wihle(1) { printf("あれれ・・・止まんないよー\n"); }
>>484 if(n>0)
while(n--){
たまたま実行中に末尾に'\0'のつかない配列をstrlenに渡したり、書き換え不能な領域をstrcatの第一引数にする状況が発生したら、 そんな暢気なことは言えなくなるのだよ。
たいしてコード量が増えないなら、安全側にプログラムするのは職業プログラマなら常識。
>>493 みたいなこという奴はおこちゃま。
>>478 %oと%xに対応するのはunsigned int *
>>494 自分が増やしたコード量を認識してないらしいな
なんせ「常識」つーくらいの常習者
STOPダイアログやSegmentation Faultとの重複コード書いて何やってんの?
>>496 > STOPダイアログやSegmentation Faultとの重複コード書いて何やってんの?
日本語に訳してくれ。
496は俺じゃないからな・・・ 安全を云々言うならunsigned intにするが。
>たまたま実行中に引き数が負になる状況が発生したら、 だいいち責任範囲というものがまるでわかってない 他社製品のバグが出たときの対応まで保証してられるか
500
だいいち人生はトラップだらけということがまるでわかってない
と言うか責任範囲とかにすりかえてる点で、既に使えない奴の烙印は押されてるよ。
だいいち人生の主人公は自分だけということがまるでわかってない
504 :
デフォルトの名無しさん :03/07/14 23:25
int i[]={0,1,2,3,4,5,6,7,8,9}; これがOKで、 int i[][]={ {0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8}, {10,11,12,13,14,15,16,17,18} }; これはダメ、、どうして?
>>504 配列の要素の大きさが分からないから。
int i[][N]ならOK(Nは定数)
規格博士に質問です malloc()で割り当てられた(NULLでない)ポインタpを remalloc()に渡し、メモリの再割り当てに失敗した(NULLが返ってきた)時は 元の領域は、解放されるんでしょうか? それとも、領域は残っているのでしょうか? また、fopen()で開いたストリームの(NULLでない)ポインタfpを freopen()に渡し、ストリームを開くのに失敗した(NULLが返ってきた)時は 元のストリームは、閉じているのでしょうか? それとも、開いたままなのでしょうか? 自分で同様の関数を書けば関係ないと言われそうですが 規格上で、どうなってるのかを知りたいので宜しくお願いします
× remalloc()に渡し、メモリの再割り当てに失敗した(NULLが返ってきた)時は ○ realloc()に渡し、メモリの再割り当てに失敗した(NULLが返ってきた)時は
>>507 規格博士じゃないが。
s/remalloc/realloc/だよな? 元の領域は解放されずに残るよ。
だからrealloc前のポインタは保存しておかないとfreeできなくてリークしちゃう。
freopenは、成功しようが失敗しようが元のファイルはfcloseされる。
>>509 いやあ、昔々のC言語だと、reallocに失敗するとメモリが
解放されちまったのよ。そんなバカなと思うだろうが、
実際バカなので、今じゃ直ってるけどな。
ANSI-C以前の暗黒時代の話なので、今時そんな実装を気に
する必要はないが。
BCBスレで聞いてたのですが、こちらのスレの方にあってきたので質問させてください。 ある固定長のデータを構造体にコピーするときアライン以外に気をつけることはありますでしょうか? char []="0123456789" を struct hoge{ char a[4]; char b[3]; char c[3]; }; にコピーして要素ごとに処理しやすくしたいんです。 当然、各要素の最後に"\0"がないので取り出した要素の使い方にも注意が必要ではあるのですが。
↑ char hogehoge[]="0123456789"; としてください。失礼。あ、"\0"が・・・うーむ・・・。
別にそのままでも変わらないような気がするんだが やっぱウニオンかな union hoge{ char hogehoge[10]; struct{ char a[4]; char b[3]; char c[3]; }; } hage={"1234567890"}; int main(){ fwrite(hage.a,1,4,stdout); return 0; }
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
質問です。 みなさんが gets ではなく fgets を使えと おっしゃるのは、getsにバッファ長の引数が無く、 バッファオーバーランの危険があるという理解でよいでしょうか?
>>514 printf("%.4s\n", hage.a);
或いは
printf("%.*s\n", sizeof(hage.a), hage.a);
って、書いてから気付いたけどstructに名前がついてないな。
struct {...} s;
として、
hage.s.a
か。
>>516 そうです。
>>518 hage.a にアクセスしたじてんで、hage.a は[1][2][3][4][\0]になるのでしょうか?
>>520 ああ、だからsizeof(hage.a)でブッコ抜くんすね。
"\0"がないから、char *tmp=hage.a; とかってすると、hage.bやらhage.c やらも引っ付いてくるのが
気持ち悪かったのでつ。
522 :
デフォルトの名無しさん :03/07/15 20:37
int i; for(i=0;i<10;i++) ; 無限ループになります。なんで? コンパイラのバグですか?
おまえのPCが遅すぎるんだ
>>522 それはコンパイラのバグ
そういやIntelのコンパイラで
short i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d%d\n, i,j );
}
}
とやると、外側のループが1回しか実行されないバグがあったな
>>522 参考までにコンパイラと OS を教えちくり。
Mini-Cってなんだろう・・・
Mini-C...初めて聞く名だ。 とりあえず Mini-C だと空ループは無限ループになる...と。 、、φ(.. ) メモメモ
Z80。。
531 :
デフォルトの名無しさん :03/07/16 00:24
ネット上や参考書等のC言語ソースで、例えばfopen関数の戻り値はチェックするのに fclose関数の戻り値をチェックをしていなかったりしています。なぜか自分も自然とそのように プログラミングしてしまっていますが、このようにエラーのチェックをする時としない時があるのですが、 何を基準にしてする時としない時に分けられるのでしょうか?C言語に特化しておらず、抽象的な話かも しれませんが、意見を聞きたいのでよろしくお願いします。
>>531 fclose()失敗したって何もフォロー出来ないからね…
>>531 戻り値を特に使用しない場合は受け取らない。
>>531 fopen(file, "r");
のときは
fclose()
の戻り値は無視していい。
しかし、
fopen(file, "w");
のときの
fclose()
の戻り値はチェックしてフォローする必要がある。
>>532 エラーメッセージくらい出さないのか?
>>534 どういう時に失敗するの?
つーか、その前に、読み書きで失敗しない?
for example. /* ディレクトリエントリの読み出し */ FILE *fp = fopen("foo", "w"); char buf[200]; /* ここも当然、読むだけ */ fgets(buf, sizeof(buf), fp); /* ここでは読みこみも書き出しも発生しないので通常、エラーになり得ない */ fclose(fp); /* ディレクトリエントリの作成、当然ファイルの実体はない */ FILE *fp = fopen("foo", "w"); /* バッファリングされるのでここでは書き出されない */ fprintf(fp, "bar\n"); /* ここでフラッシュされるので、書き出しが行なわれる */ fclose(fp); というわけで、ディスクフルのときにライト時のfclose()でエラーが発生する。
malloc関数のようなアプリケーションエラーとなる致命的なところでは エラーチェックは当然だと思うのですが、あたりまえのように 使っていたりするstrcpy関数等も必ずチェックしなければいけないと 思います。確かに戻り値を拾ってきてもエラー文出すぐらいしか できませんが…。経験で知れということなのでしょうか。
strcpy なんか使わんし。
>>536 それって、オープンした時にエラーが出るでしょう?
>>537 そりゃ、不正なポインタを渡せばエラーが出るのは当然で
そんなプログラム書く香具師の方が悪いと思うけど?
>>535 他のプログラムから削除されたりとか、
ディスクをいきなり取り出したりとか、
ディスクがいかれたとか、
まぁ、いろいろありそうやね。
特にゲーム機のメモリーカードとかだと
そういうことに気をもむ必要はありそうやね。
strcpy -> strcmp 間違いでした。
>>542 メモリーカードか…
それは、考えた事なかったな…
fopenとかfcloseでメモリーカードのデータが読めるゲーム機なんてあるの? システムコールとか使うんじゃないの?
まぁ、ゲームプログラマからの受け売りなのだが。
>>543 strcmpはエラーが発生しない(errnoにだってなにもセットしないよね?)
しかしあれは戻り値を見ないと何も意味がない・・・
基本的に他のプログラムに削除されるなんて事は考える必要ないと思うし 稼動中のディスクを抜き差しする香具師の事も考える必要はないと思うけど (ディスクが壊れるのは(特殊なプログラムを除いて)論外) 確かに(ゲーム機に限らず)メモリーカードのように 動いてるのが見えないものの抜き差しは考えた方が良いかも知れないですね…
自分で検証もしないで推量だけで折角のヒントを否定する痛い 香具師が集まるスレはここですか?
>>535 >基本的に他のプログラムに削除されるなんて事は考える必要ないと思うし
あ〜あ。
ついでに言えば、ディスクフルになることも考慮しないのかな?
>>552 それは絶対に他の何処かでエラーが出るでしょう
>>552 書き込み時にチェックしないの?(^_^;)
ごめん、バッファに溜まってたら出ないね
>>554 FILE *fp = fopen( "xx", "w" ) ; /* 開く */
fwrite ( buf, 1, 8192, fp ) ; /* バッファに溜まる */
fclose ( fp ) ; /* ディスクが一杯 */
>>556 いつもバッファリング無しにしているから
>>557 俺は必ずfflush()してるから失念してた
まあ冗談はおいておいて、ディスクフルまで考えたことはなかったかなぁ。
>>559 フロッピーなんて、たった1.4MBしか使えないんだからすぐ一杯になるよ。
フロッピーってなに?
>>560 そういえばそうだねー
メモリーカードもフロッピーほどじゃないけどディスクフルになる可能性が高いかも・・・
いつもHDにしか書き込まないもので
ところで、
>>536 のコードって、オープンした時に
NULLが返ってくると思うんだけど、
そのまま、fgets()やfprintf()にNULLを渡して大丈夫なの?
プレステ場合は容量決めとくのが普通だから ディスクフルはあまり考えんでもいい気もする。
>>564 ゲーム機じゃなくて、フラッシュメモリとかを考えようよ
>>565 書き込む前に空き容量を調べるんじゃないの?
あれこそ他から書き込まれるおそれはないし。
カードの故障まで考えるとそうはいかないかな?
段々スレ違いになってきた。
>>570 んじゃ、質問。
fopen()で得たポインタの実体がmalloc()で確保されてる場合
fclose()に失敗したら、その実体はfree()されるの?それとも、リークするの?
>>571 環境変数MEMLEAK_JOTOを検出した場合はリークする。
糞レスしたらスレ一覧のレス数に反映されんかった・・・
ギャグなんだから笑ってやれよ
>>571 mallocで確保すると決められてはいない以上、どうなるかはライブラリのつくりに依存するんじゃない?
errno の取り得る値ってのは仕様では決められてないの?
>>576 まぁ、malloc()とは限らないけど、
基本的には、何かしらの方法で容量を確保する(されてる)訳で、
それを再利用出来るのだろうか、と言う事
それとも、どうせ僅かな容量なのだから、
そんな細かい事は気にするなって事なのだろうか…?
昔は何個くらいか固定長でとってある実装が普通だったと思うけど、 今はどうなってるんだろうね。
>>577 int
って話じゃなくて、何処から、何処までが処理系で
何処から、ユーザが使用して良いかって事?
>>578 様々な要因でfcloseに失敗してもメモリーの解放はできると思うから、しなかったらライブラリのバグじゃねーか?
>>580 errno の取る値がマクロか何かでよく定義されてあるけど、
それに互換性はあるのかってこと、と言ってもいいかもしれん。
>>581 でも、1度 fclose() に失敗しても、
もう1回やれば成功しない保証は無いと考えれば、
解放する方が、バグって考え方もあるよね
>>583 複数回クローズを試みるのか!
それは考えなかった!
>>582 互換性が無いから、値を #define してるのだと思われ
ちなみに、Cで標準に定義されてるのは
EDOM EILSEQ ERANGE
の三つだけ…
つーか、これ、1つも使った事ないし…
587 :
デフォルトの名無しさん :03/07/16 03:13
K&R のさ、malloc/free の実装の説明のさ、morecore ってあるじゃん。 あれの 下から 2 行目くらいの free((void*)(up + 1)); って何? 俺にはどう見ても sbrk から返されて s.ptr が不定な状態のチャンクを 解放しに行ってるようにしかみえないんだけど、何がしたいの?
>>586 freopen()の説明なんか見ると、
失敗は無視するって書いてあるから、
fclose()も同様に、失敗は無視して解放するのかな…
と言う事は、1度fclose()に失敗したストリームに
2度目のfclose()は無いのだろうか…
>>587 ソースを見てみないと分からないけど、俺には
>free((void*)(up + 1));
が、何故キャストしてるのかの方が不思議だ
もしかして、upってポインタじゃないとか?
Cコンパイラさっぱりワカンネ
591 :
デフォルトの名無しさん :03/07/16 14:56
最短経路を求めるアルゴリズムはDIJKSTRA法がありますが 最長経路を求める方法はありませんか?
>>585 なるほど。
標準なのは3つだけなんですか。
よく分かりました。
593 :
デフォルトの名無しさん :03/07/16 15:07
594 :
デフォルトの名無しさん :03/07/16 19:02
半角文字なら下のプログラムでできたんですが 全角文字じゃできません。考え方を教えてください。l初心者です。 scanf()やfor文とかしか知らなくてもできると言われたのですが #include <stdio.h> void main(void) { char a[100]; int i; i=0; scanf("%s",a); while(a[i]!='\0') { i++; } for(i=i-1;i>=0;i--) { printf("%c",a[i]); } }
>>594 「全角文字」が2バイトの文字であるとする。
#define BYTE_OF_MBCHAR 2
#define STRINGNIZE_IMPLEMENTATION(x) #x
#define STRINGNIZE(x) STRINGNIZE_IMPLEMENTATION(x)
#include <stdio.h>
void main(void)
{
char a[100];
int i;
i=0;
scanf("%s",a);
while(a[i]!='\0')
{
i++;
}
for(i=i-BYTE_OF_MBCHAR;i>=0;i=i-BYTE_OF_MBCHAR)
{
printf("%" STRINGNIZE(BYTE_OF_MBCHAR) "s", &a[i]);
}
}
>>594 >半角文字なら下のプログラムでできたんですが
何が?
>全角文字じゃできません。
何が?
>考え方を教えてください。
何をしたいのか教えてください。
>初心者です。
言い訳のつもり?
597 :
デフォルトの名無しさん :03/07/16 20:02
説明不足でした。 12SD と入れたら DS21 あ位う123絵オ と入れたら オ絵321う位あ という感じに出力されるプログラムです
598 :
デフォルトの名無しさん :03/07/16 20:10
ANSI以前の書式で書かれたソースをANSI形式に変換するツールってありますか? int function(giko mona) int giko char *mona { } ↑のようなのを↓のような風に変換したいのですが、大量にあって手作業では時間がかかりすぎるのです。 int function(int giko , char *mona) { }
perl
コンパイルの仕方が分かんないです OSウインドウズXP使ってるんですが とりあえずBorland C++ Compiler 5.5落としてきて #include <stdio.h> maim() { printf("TEST"); } てファイルをメモ帳で書いてtest.cって名前で保存してみたら 一応test Cファイルって出来ました。 コマンドプロンプト C:\Document ***>bcc32 text.c て入力してみたんですが 'bcc32' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とかでます。
>>594 >>597 #include <stdio.h>
#include <string.h>
int main(void)
{
const char s[11]="1山2本3山4";
char s2[11];
int i,l,c;
for(i=0,l=strlen(s),c=0;i<l;i++)
if(c){s2[i]=s[l-1-i+1];c=0;}//前がワイド文字
else if(s[i]<=-1){s2[i]=s[l-1-i-1];c=1;}//ワイド文字
else{s2[i]=s[l-1-i];}//普通文字
s2[i]='\0';
printf("%s\n",s2);
return 0;
}
>>602 ありがとうございます。
結構分かり易いとりあえず書いてあることやってみました。
完璧と思ったのに、何故か
C:\>pathで
c:\borland\bcc55が出てきません・・・
環境変数のPATHのとこにはちゃんと書いたのに
てか、PATHの他の変数間違えて消しちゃったし・゚・(ノД`)・゚・
どうしおう
>>604 WinXPだったら一度ログオフしないといじった環境変数が有効にならなかったような。
>>605 ありがとうございます!
再起かけてみたらちゃんとなりました多謝!!
・・・でも血迷って消しちゃった他の変数は・゚・(ノД`)・゚・
ど、どうなっちゃんですかね。。。
607 :
デフォルトの名無しさん :03/07/16 23:36
構造体のポインタの配列を考えているのですが、 構造体 STRUCT が STRUCT の配列 STRUCT **children; を持つ構造体としたとき、 STRUCT test; を考えます。 このとき、test の配列 children の要素数 length を動的に取得し、 test->children の要素数 length だけ malloc したいのですが、 test->*childeren = (STRUCT *)malloc(length * sizeof(*STRUCT)); だと、左辺側でエラーになります。 どうすればよいでしょうか。 よろしくお願いします。
sizeof(*STRUCT))
・・・でもbcc入力しても相変わらず 'bcc32' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とか言われちゃいます。。。
611 :
デフォルトの名無しさん :03/07/17 00:02
#include<stdio.h> int main() { int *ptr; int num[2]; ptr = num; *ptr = 20; *ptr++=100; *ptr++=200; printf("%d\n",num[0]); printf("%d\n",num[1]); return 0; } このプログラムを実行すると 100 200 と出力されるのですが、*ptr=20の値はどこに行ったのでしょうか? またnum[2]→num[1]に変更すると 100 204 というように値が変わって出力されてしまいます。
ダーリン、オーバーランだっちゃ
>>607 意味が分からない
欲しいのは、ポインタの配列?
それとも、実際の配列?
やっぱりここもスレ違いなのか。。。
>>610 BCCで検索しても何もでないんですよ。。。
>>615 ありがとうございます
思いっきり似たような話題でてますね
さっきの質問コピペようかと思ったけど、ちょとじっくり読んでみます。
>>611 自分で上書きしておいてどこに行ったもなにもないでしょ
>>611 『後置インクリメント』でググってみよう。
>>613 欲しいのは(malloc したいのは)構造体のポインタの配列です。
>>619 test->childeren=(STRUCT**)malloc(length*sizeof(STRUCT*));
621 :
デフォルトの名無しさん :03/07/17 01:59
12SD と入れたら DS21 あ位う123絵オ と入れたら オ絵321う位あ という感じに出力されるプログラムお願いします。 printf()、scanf()やfor文、if()、while()、for()、配列だけで できると言われたのでそれらだけで作ってください。
同じ質問見たが、宿題か。
623 :
デフォルトの名無しさん :03/07/17 02:07
ただしつこいだけです。constなんて習ってません
624 :
デフォルトの名無しさん :03/07/17 02:39
626 :
デフォルトの名無しさん :03/07/17 03:24
627 :
デフォルトの名無しさん :03/07/17 04:27
>>621 まず文字コード体系を判定する必要がある。
日本語などの多バイト文字はコード体系が変われば処理も変わる。
630 :
デフォルトの名無しさん :03/07/17 09:20
const char *c="abcdefg1234567890zx"; char str[16]; strcpy(str,c); printf("%s\n",str); printf("%c\n",str[0]); printf("%c\n",str[18]); getchar(); これが、コンパイル通るんだけどどういうこと? [16]ってことは、[15]までだよね?VC6です。
631 :
デフォルトの名無しさん :03/07/17 09:22
>>630 Cは配列の添え字チェックをしない。
str[18]は*(str+18)という意味なので文法上全く問題ない。
三行目は見当違いだったかも。 とにかく文法上問題ないのでエラーになったりしない。
>>630 const char *c="abcdefg1234567890zx";
char str[16];
char aho[10];
strcpy(str,c);
printf("%s\n",str);
printf("%c\n",str[0]);
printf("%c\n",str[18]);
printf("%s\n",aho);/* これはどうなる? */
>>633 自動変数の確保の順番は未定義だったはず。
>>633 質問とまったく関係ない。
そしてそういう余計な話は初心者を混乱させるだけ。
>>635 オーバーフロウしたものがahoに入るかもしれないと言いたいんだと思われ。
でも
>>634
>>630 コンパイルに関しては>631,632の通りだが
それ以前に
strcpy(str,c);
がいけないことだっていうのはOKなのかな?
18にアクセスしようとしてるからわかってそうだけど。
>>633 printf の第2引数は、constになってるから、警告が出るんじゃない?(コンパイラーにもよるけど)
ahoは初期化(値が設定)されていないのに参照される可能性がある。みたいな。
>>638 printfの第二引数以降は...だからなんでも受け付けます。
二行目と三行目のつながりが分からない。
>>633 これはどうなると聞かれても。
>630が自分のまだ答えてないよ。
642 :
デフォルトの名無しさん :03/07/17 21:08
こんばんわ。わからないことがあるので質問させてください。 unsigned int *buffer; unsigned long int result; buffer = (unsigned int *)malloc(2048); for (row = 0; row < height; row++) { TIFFReadScanline(tiff, buffer, row, 0); for(x=0;x<width;x++){ result = * ((unsigned int *)(buffer + x)); printf("%d %d %u \n",row,x,result); } } このようなループがあるんですが row=0,x=533までしか実行できず、セグメンテーションエラーと言われます。 どのように修正すれば最後まで実行できるでしょうか。 ちなみに TIFFReadScanline(tiff, buffer, row, 0); は開いたtiff画像を一行読み取り、各ピクセルの輝度を16bitの整数としてbufferに格納します。 rowは行番号、0は画像番号です。 拙い文章でわかりづらいとは思いますがよろしくお願いします。
malloc(sizeof(unsigned int)*width)
rewindってどういうときに使うんでつか?
人生に疲れたとき。
646 :
デフォルトの名無しさん :03/07/17 21:51
>>643 レスありがとうございます。
すみませんが、さらに質問させてください。
考えている対象は一行あたり1024ピクセルの画像で、
1024個の要素を持つint型の配列を読み込む事になるわけなので、
malloc(2048)としたのですが
これは 2byte×1024 = 2048byte ってことで
width = 1024 の時 sizeof(unsigned int)*width
と中身は同じかと思うのですが、いかがでしょうか?
int は 2 バイトとは限らない。
32bitなら4byteじゃないかな。
今確認してみました。 intは4byteありました。お騒がせしてすみません。 どうも僕の中では、 char は 8bit で 1byte int は 16bit で 2byte と思い込んでいたみたいです。 どうもありがとうございました。
>>637 いけないこと?
とりあえず試してみたんだけど、通ったから
問題ないのかと思ってた。
18にアクセスしたのは、こういう場合は後ろの方は切れてしまうのかな?
と、思ったのでちょっと試してみたら参照できた。なんで?って感じ。
>>633 のやってることの意味がまったく分かりません。
お、オーバー浮浪?
>>650 >通ったから問題ないのかと思ってた。
Cでは「未定義の動作」に気をつけにゃならん。
エラーが出ることすら保証されていない。
要するに、自分がしていることが本当に正しいかどうかを
自分で判断できにゃならんのだ。真に科学的な態度が要求される。
Cではと言ったが、これができる者だけが長い目で見てやってける香具師だ。
【GUIライブラリ】wxWindowsでのひょーん スレからやってきますた。
http://pc2.2ch.net/test/read.cgi/tech/1052186697/335 質問です。
bcc32 v5.5.1 な環境において、
char *setlocale(int category, const char *locale) の戻り値を
第二引数にして、setlocale() を再度呼び出すと、
第二引数が破壊され、戻り値が NULL になってしまいます。
一応調べたところ、下記のような記述
> The application shall not modify the string returned
> which may be overwritten by a subsequent call to setlocale().
> アプリケーションは返されたストリングを修正しないものとします、
> それはsetlocale()への後の呼び出しによって上書きされるかもしれません。
>
http://www.opengroup.org/onlinepubs/007904975/functions/setlocale.html がMSのサイトやらMAN pageやらから見受けられたので、この動作は未定義?
とも思うのですがいまいちすっきりしません。
これって、bcc32 固有の不具合なのでしょうか?
それともCの仕様でしょうか?
ちなみに、gcc では locale の設定が行われ、問題なく動作できますた。
よろすくおながいします。
>>651 未定義の動作だよって報告すら出ないのか?
struct List { std::string buf_; } と、 printf("%s",l1.buf_.c_str()); を日本語で説明おねがいします。意味がわかりませんでした。。
>>650 >strcpy(str,c);
文法的には問題ないのでコンパイルは通るけどコピーするサイズが問題。
strよりcのサイズが大きいために
strをオーバーしてコピーしてしまって
意図しないメモリ領域を壊してしまっている可能性がある。
(バッファオーバーフローとかオーバーランとか言う)
なのでstrがc以上のサイズを持っているかチェックしてからコピーするか
strncpyを使うかしる。
連結リストや二分木などがわかりやすくのってるサイトってないでつか? マジお願いします。
お願いします・・・。scanfと関係があるんですか? バッファに文字を残した場合に、それをリフレッシュするって感じでしょうか?
>>660 ではどういった場合に使うのでしょうか?
>>658 二分木載っているけど、これでよければ
tp://www1.cts.ne.jp/~clab/hsample/Mem/Mem2.html#void
>>659 fseek(fp,0L,SEEK_END);
と同じで、scanf()とかとは、直接的には全く関係ない
ただ、rewind()すると、EOFをクリアしたり等々
標準入力で便利に使える処理系が多いのも事実
>>644 ファイルの先頭から読みなおしたいときによく使うが。
>>663 標準入力で便利に使えるというのは具体的にどういった場合なのでしょうか?
突っ込んでくれないと、おぢさんは悲ひい…
突っ込んでやるから、ケツを出せ
>>663 > fseek(fp,0L,SEEK_END);
(void)fseek(stream, 0L, SEEK_SET) だろ
>>665 >EOFをクリアしたり等々
って書いてあるじゃん
標準入力からのEOFはCtr+Z? whileの判定でEOFを使ってるならまだしも、コントロールコードを用いてる場合は、 意味がありますか?
標準出力で rewind すると、 キーバッファクリアになる処理系が存在する。
出力じゃなくて入力だ。
>>671 それを標準の動作であるかのようなことを言っていた人がいたね。
'\0' は必ず 0 で定義されるんですか?
'\0'==0 文字定数か整数定数かの違い
>>675 その等式はどのコンパイラでも正しいですか?
C言語の規格として定まっているんですか?
>>676 手持ちの ANSI C/C++ 辞典には
「すべてのビットは 0 である」と書いてあるので、
大丈夫だと思います。
ところが整数0について「すべてのビットは 0 である」という記述はない。 よって'\0'==0という保証もない。○か×か
×に一票
>>678 0 と等しい内部表現を持つ、
という意味で全てのビットが 0 である、
と言ってるんだと思うので×。
でも、その視点は無かっただけにちょっと感動した。
あ、整数値としての 0 ね。 ヌルポインタじゃなくて。
文字定数は 'ab' のように、複数の文字からなる場合の値は 処理系定義となっているが、'\0\0' なら全てのビットが 0 なので '\0\0' == 0 は成り立つ ○か×か
処理系定義なので何が起こっても構わないので×。
>>683 処理系定義が、何が起こっても構わないってのはダウト
おまえら糞壁と一緒だな(藁
>>657 あーなるほど、そういうプログラムがあるからOSが不安定になったりするのかな?
気を付けるようにします。
687ゲット!!
>>686 時々セキュリティ情報などでバッファオーバーフロウが云々という記事をみかけるでしょ?あれ。
657に書いてあるじゃん(鬱
あんなのがあるって事は。 M$の社員にも糞がいっぱいいるってことか。
690 :
デフォルトの名無しさん :03/07/18 15:55
VC++で、 文字列が英語の文かどうか判定したいです。 全角文字なら英語でないとすると、 こんなもじ↓ “ が全角文字で英語にならなくなってしまいます。 上の文字は英語のサイトでも使われてる文字なので、英語として扱いたいです。
>>689 実際にはコードの時点からオーバーしてるわけじゃなくて
何らかの方法で無理矢理あの状態を作り出されたときに
サイズチェックしてなくてあぼーんするって感じかな。
まあよく知らないんだけど( ´д`)
"と“は別物だが? (C), (R), TM あたりで困るというのなら分かるけど。
英語のサイトで全角文字か…
>>690 先ずは文字コードについて勉強しろ。話はそれからだ。
695 :
デフォルトの名無しさん :03/07/18 16:27
エスケプシケンス使わずに画面をクリアするには、 printf("system・・・・ よく覚えてないです。 どなたか教えてください
おまえら、画面制御の質問するときは 環 境 を 書 け
697 :
デフォルトの名無しさん :03/07/18 16:36
すみませぬ。 WinXP、BCC5.5です。 環境を書いてなくてすみませんでした。
698 :
デフォルトの名無しさん :03/07/18 16:37
system("cls"); /* DOS */ system("clear"); /* UNIX */
おまえら、画面制御の質問するときは そ の 環 境 の ス レ に 行 け だろ?
700 :
デフォルトの名無しさん :03/07/18 16:46
>>698 どうもありがとうございます。
勘違いしてました。
タブキーを押すと右に*が移動し、3回動いたら改行する
プログラムを作りたいんですが、根本的に間違ってますでしょうか?
まだ作りかけですが、どうか見てください
#include <stdio.h>
#include <conio.h>
int main(){
int a=1,b=1;
char Key;
for(;;){
system("cls");
Key = getch();
if (Key=="\t"){
a++;
if(a<=3){
printf(" *");
}
else{
printf("\n");
b++;
a=1;
}
}
}
}
>>694 文字コードはShiftJISでやってます。
クリップボード経由のデータなので、もともとの文字コードは意識してないです。
コンパイル通るよん♪ まさか、君Cやったことないでしょ? ( ´_ゝ`)プッ
>if (Key=="\t")
> if (Key=="\t"){ > if (Key=="\t"){ > if (Key=="\t"){ > if (Key=="\t"){ > if (Key=="\t"){
706 :
デフォルトの名無しさん :03/07/18 17:28
正しくはif(Key==\t){
#include <stdio.h> #include <conio.h> int main(){ int a=1,b=1; char Key; for(;;){ system("cls"); // 画面を消す。 Key = getch(); // 入力するまもなく通り過ぎる if (Key=="\t"){ // Keyの初期値(ごみ)と文字列リテラルのアドレスを比較する。 a++; // aが2になる。 if(a<=3){ //必ず真になる printf(" *"); //*を表示 } else{ //以下のコードは通ることなく終了。 printf("\n"); b++; a=1; } } } } ( ´_ゝ`)プッ
それはそうとして conio.h なんか使ってるんだったら他所へいけ。
違った、最初のifがすでに成り立たないや。 何も表示せずに終了か。
712 :
デフォルトの名無しさん :03/07/18 17:44
正しくはif(Key==\t){
質問者が煽るとグダグダになるという好例ですな。
>>703 は偽物です。
でも、やっぱりコードがぐちゃぐちゃなのは確かでしたね。
>>712 マジですか?
正しくは if(Key == '\t') {
716 :
デフォルトの名無しさん :03/07/18 17:55
どうでも良いけど無限ループじゃない?
700の正しくしたコードきぼんぬ
718 :
デフォルトの名無しさん :03/07/18 18:05
721 :
デフォルトの名無しさん :03/07/18 18:30
煽ると騙るを間違ってる香具師ハケーン
>>717 #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main() {
int a = 1, b = 1, i;
char Key;
system("cls");
while( (Key = getch()) != 'q' ) {
system("cls");
if (Key == '\t') {
if ( a <= 3 ) {
for (i=0; i<a; ++i) printf(" *");
++a;
} else {
printf("\n");
++b;
a = 1;
}
}
}
printf("\nb = %04d\n", b);
return EXIT_SUCCESS;
}
>>724 #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main() {
int a = 1, b = 1, i;
char Key;
system("cls");
while( (Key = getch()) != 'q' )
if (Key == '\t') if ( a <= 3 ) printf(" *", ++a); else printf("\n", ++b, a = 1);
printf("\nb = %04d\n", b);
return EXIT_SUCCESS;
}
726 :
デフォルトの名無しさん :03/07/18 19:18
>>724 #include <stdio.h>
#include <conio.h>
int main() {
int a = 1, b = 1, i;
char Key;
system("cls");
while( (Key = getch()) != 'q' )
system("cls");
if(Key == '\t') if ( a <= 3 ){
printf(" *", ++a);
}
else {
printf("\n", ++b, a = 1);
}
}
728 :
デフォルトの名無しさん :03/07/18 20:55
これってどうして二回目のscanfはスキップされるんですか? よろしくおねがいします #include<stdio.h> void main(void){ char c,d; scanf("%c",&c); scanf("%c",&d); printf("%c %c",c,d); }
スキップはされない。 ちゃんと改行を読み取って表示する。
730 :
デフォルトの名無しさん :03/07/18 21:08
>>729 即レスありがとうございます。
どうにかして改行を読み取らないようにはできないでしょうか?
printf("Hello", " ", "world");
732 :
デフォルトの名無しさん :03/07/18 21:09
733 :
デフォルトの名無しさん :03/07/18 21:10
ちょっと質問させてください。 引数を整数に直してから表示するプログラムにしたいのですが 以下のようにすると、引数と違った結果になってしまいます。 どうしてでしょうか? #include<stdio.h> #include<stdlib.h> main(int argc, char *argv[]) { int a,b,i; int x[1],y[1]; x[0] = atoi(argv[1]); y[0] = atoi(argv[2]); x[1] = atoi(argv[2]); y[1] = atoi(argv[3]); for (i=0;i<2;i++){ printf("%d %d %d\n",i,x[i],y[i]); } }
734 :
デフォルトの名無しさん :03/07/18 21:11
ふたつの意味でね(^_^;)
737 :
!=733 :03/07/18 21:22
ホントに2つだ。。はじめ気づかなかった。
739 :
デフォルトの名無しさん :03/07/18 21:29
名前を並び替えたいんだけど、エラーが出てしまう。 どこを直せばいいです??マジでわかんないもんで。 { char name[5][9] = {"yamada","kawasaki","ishikawa","machida","fukui"}; char tmp[9]; int i, j; for (i = 0; i < 4; i++){ for (j = i + 1; j < 5; j++);{ if (name[i][0] > name[j][0]){ tmp = name[i]; /*エラー「左辺値が必要(関数 main )」*/ name[i] = name[j]; /*エラー「左辺値が必要(関数 main )」*/ name[j] = tmp; /*エラー「左辺値が必要(関数 main )」*/ } } } for (i = 0; i < 5; i++){ printf("%s\n", name[i]); } return(0); }
740 :
デフォルトの名無しさん :03/07/18 21:31
>>739 配列名に代入はできないから。
配列のコピーはmemcpyで。
そういうもののソートは元のデータをポインタ配列にした方がいいと思うけど。
文字列は = じゃコピーできん。 strcpy()つかえ。
誰もソートとはいってねーか。スマソ
え〜? さっぱりわからんです。ヒント下さい。
>>740 >>741 文字列は数字みたいに代入することはできないってことか。感謝です。
でもそれをどうやって使えばいいかぜんぜんわかんない。。。。
ありがとうございました。
>>743 int x[1]で使えるのはx[0]だけ。x[1]を使いたかったらint x[2]とする
ポインタ配列にしようと思って配列をポインタ配列にしてみたけど ( name[5][9 を *name[5][9] など) コンパイルの時にエラーは出なかったけど実行したらエラーがでてしまった。 どこをどう直せばよかったんですか??
>>745 あ、ありがとうございます。
うわーはずかしいー。
748 :
デフォルトの名無しさん :03/07/18 22:04
ポインタには値は入れられないから、アドレスを入れる たとえばint *i; int j=5; と言う場合 i = &j; って感じに &は変数のアドレスっていう意味
749 :
!=733 :03/07/18 22:09
x[0] = atoi(argv[1]); y[0] = atoi(argv[2]); x[1] = atoi(argv[2]); /* 3じゃ */ y[1] = atoi(argv[3]); /* 4じゃ */
750 :
デフォルトの名無しさん :03/07/18 22:13
シューティングゲームみたいに上から☆がランダムで 5個降ってくるというふうにCのコンソールで表現したいのですが、 アルゴリズムはどうしたらいいでしょうか? サンプルがあればお願いします。 できればコメントもお願いします。図々しくてすみません
751 :
mainの戻り値 :03/07/18 22:14
main()の戻り値、成功なら0、失敗なら1とするのが普通と思うのですが、 で、実際stdlib.h(以下はgccの例)に #define EXIT_FAILURE 1 #define EXIT_SUCCESS 0 とか書いてありこのマクロを使えというのを昔読んだ記憶があります。とはいえ しかし、このマクロ使っている人を見たことがありません。 これってどこかで使われてます??
>>751 OSに依存しないプログラムを書くときは使ってるよ。
>>751 失敗時はfprintfの戻り値にしている。
755 :
デフォルトの名無しさん :03/07/18 22:29
>main()の戻り値、成功なら0、失敗なら1とするのが普通と思うのですが、 普通って? 実行環境とのインターフェイスをキミはどう設計しているの?? コーディングの段階で悩むに至った過程こそ そんなくだらんことが誤差にもならん程の深刻な問題だぞ。
mainの戻り値はそのプログラムを誰が起動するかでおのずと決まってくる。 hello world の戻り値なんて、ユーザが起動して戻り地なんか無視しているんだからどーでもいい。
758 :
デフォルトの名無しさん :03/07/18 22:34
doubleの方がよかったのに
759 :
デフォルトの名無しさん :03/07/18 22:36
>>757 勝手にhello worldを起動するのがユーザと決め付けるんじゃねーよ。
/bin/false
一般論をいったまでだがね。 後学のために、どんなシステムでhello worldを起動しているのか教えてほしいものだ。
CGI
763 :
デフォルトの名無しさん :03/07/18 22:39
>>761 一般論というのならhello worldじゃなくて一般的なプログラムで
話そうじゃないか。 そのプログラムを起動しているのは誰かね?
764 :
デフォルトの名無しさん :03/07/18 22:40
>>750 APIを使うしか方法はない。
あとは、他の誰かに聞け
765 :
デフォルトの名無しさん :03/07/18 22:42
>>764 はぁ?
cygwin使っても出来ますが何か?
main関数もライブラリ化しましょう!
767 :
デフォルトの名無しさん :03/07/18 22:43
>>726 のコードは何をするためのプログラムですか?
>>674-681 Cでは文字定数はint型で'\0'は、8進表現の0を表す
よって、'\0' == 0 は必ず成り立つ
常にこういうシェルを通して実行するような 用心深い人もいるかもしれないね。 #!/bin/bash -f if (( $# == 0 )); then exe=./a.out else exe=$1 fi if $exe; then echo 'success!' else echo 'failure...' fi
>>750 アルゴリズムが何なのか分かっているのか小一時間(略)
772 :
デフォルトの名無しさん :03/07/18 23:38
ずれたら・・・ ,,--―'''""`ヽ'  ̄`ヽ、 / ヾ / ~`ヽ / ヽ;: /"""ヾ ヽ / ;:;;:::'''' l /;:;;:::''' \ i / /;:;;:::''' ヽ ヽ | | _,,___ . _,,,,__,_ヽ | / ;/ / ゙^\ヽ.. , /゙ ¨\,.- / ;:;:ヽ「 ● | 》 l| ● ゙》ヽ i /i,. .,ノ .l| 《 .|ヽ ヽ | | \___,,,,,_/ .'″ ^=u,,,,_ v/ | | | |. |. | | ;:| ::::::: | :| | ヽ. ( ,-、 ,:‐、 | | | /ヾ.. | | | | __,-'ニニニヽ . | | .. | `、ヽ ヾニ二ン" / | | ヽ\ / | | l `ー-::、_ ,,..'|ヽ./ ヽ. :人 `ー――''''' / ヽ /;:;:;:;;:;:;: _/ `ー-、 ,.-'" \ー-、 ,.-'" \: \ .,.-''" | /. \ ~>、,.-''" | ,,..-‐'''"" ヾ ,.-''"| /――――、/
やべっ。なんか変な風にズレてしまった。 鬱
774 :
デフォルトの名無しさん :03/07/18 23:50
forループでループを回してループ変数 i という名前の ファイルを読み込む場合どのようにすればよいでしょうか? もしくは、i.txt というファイルを読み込むにはどのように すればよいでしょうか? atoiみたいにiを文字列に変換できればよいのですが。
itoaか
776 :
デフォルトの名無しさん :03/07/18 23:59
本人に聞け
sprintf()だな
>>776 のファイル名からCで書いた七行テトリスだと期待したのは俺だけか?
>>748 ポインタ配列にすればいいんですね。どうにかそこまでたどり着きました。
ありがとうございます!!
>>775 itoa・・・ですか?
自分の持っている本には載っておらず、ネットで調べても
良く分かりませんでした・・・。
>>778 なるほど。sprintfですね。
char str[20]; 初期化子以外で、この配列をすべて'x'で初期化する関数があれば 教えていただけないでしょうか。
最後の '\0' を入れないと文字列としては機能しないけどね。
787 :
デフォルトの名無しさん :03/07/19 02:11
任意の変数の値を交換する関数を作りたいんだけど 俺が考えたのは void swap(void *a,void *b,unsigned int size){ void *temp; if(a==b) return ; temp=melloc(size); memcpy(a,temp,size); memcpy(a,b,size); memcpy(b,temp,size); free(temp); return ; } サイズを渡さずに引数が交換したい変数だけの関数って作れる?
788 :
デフォルトの名無しさん :03/07/19 02:12
>>787 #define SWAP(a, b) swap(a, b, sizeof(a))
789 :
デフォルトの名無しさん :03/07/19 02:13
>>787 マクロを選ぶか、関数を選ぶか、
マクロだけを公開するか。
StandardCLibraryって本(C標準ライブラリ実装演習)に載ってるよ。
読んだ事なければ、暇つぶしに良いかも。
ちなみに、Cに限定する話しか乗ってないから、これを全てだと思って、
こだわって立ち止まらないように。
そこらおじいさんと同じになっちゃいます。
792 :
デフォルトの名無しさん :03/07/19 02:21
>>788 なるほど。
でもaはポインタでしょ
sizeof(a)が返すのはポインタのサイズじゃないの?
#define SWAP(a, b) swap(&(a),&(b), sizeof(a))
勘違いしてたら突っ込んで
>>789 その本は知らないな。
機会があれば読んでみます。
俺ならこーする。 #define SWAP(a, b, type) do { type c = b; b = a; a = c; } while(0)
794 :
787==792 :03/07/19 02:27
>>793 なるほどねぇ。
いろいろあるんだな。
ちょっと感動した。
>>787 1バイトずつ交換すればmallocを使わずにできる。
#include<stdio.h> #include<stdlib.h> struct person{ int number; int height; int weight; int sex; int i; } int main() { struct person date[20]; int i = 0; printf("番号、身長、体重、性別を入力してください.\n"); printf("ただし番号は2桁、身長は150〜180、体重は45〜90、性別は男が1で女が2というようにしなさい.\n"); while(getchar() != EOF){ scanf("%d%d%d%d",&date[i].number,&date[i].height,&date[i].weight,&date[i].sex); i++; } return 0; } 自分ではうまくやったつもりなのですが コンパイルできません どこをいじればよいですか?
;が抜けてる
>>793 ちょっと do-while を使う意味が分かりません。
普通にブロックで囲んだだけじゃダメなんですか?
>>798 それが分かるようになるまで、ブロックに囲むだけで良いよ
普通の関数と同様に使ってれば、多分、分かる事だから
802 :
デフォルトの名無しさん :03/07/19 03:50
>>799 神!!
俺もそうしよう
これ以降この話題に触れたやつは切る
>>798 そんなもの使うな、どうせ関数と全く同様に使える訳ではないんだし
それがどうしても必要ならばそろそろC++にうつる時期だ
そんな間に合わせのかたわ位で了見の狭い奴が多いな。
俺はそういう奴が大嫌いだ。だから教えてやる。
if()SWAP();elseとかを考えてみろ
どうせ教えるなら、少しひねって、 if()SMAP();else とかにすれば、可愛げがあるものを…
806 :
デフォルトの名無しさん :03/07/19 04:08
>>803 偉そうに書いてるけど、一般人にとっては常識(w
なんかばっさり切られてるね?
一般人=プログラマではない=知らない=常識ではない
>>803 全部大文字にしてあることでマクロであると警告し、
ここに代入文なんぞ突っ込むな! という主張を行っている。
そして、セミコロン対策するのはエディタの自動インデント対策でもあるし、
セミコロンがいるのかいらないのか悩む必要もなくなる。
下らんトリック使わずに仕様書にマクロだと注意書きしろよ。
>どうせ関数と全く同様に使える訳ではないんだし これにつきる
>>812 何を言いたいのかわからないが、それはきちんと「引数を複数回評価するマクロとして実装されているかもしれない」と書かれている。
注意書きがあるよりも、マクロはマクロらしくあって欲しいし 副作用の発生する関数の呼び方はして欲しくない。
>>813 >と書かれている。
何に?
少なくとも規格書ではあるまい
7.1.7 ライブラリ関数の使用法
マクロとして実装されたライブラリ関数の呼び出しでも、
その実引数がただ1回だけ評価され、
かつ必要な箇所ではカッコによって完全に保護されるような
コードに展開されなければならない。
7.9.3.9 putchar関数
int putchar(int c);
(マクロとは一言も書いてない)
常識とか言ってた人、もう来ないだろうねw
まあ C のマクロなんて糞なものは使わないのがベター。
>>818 #define putchar(c) putc(c, stdout)
#deinfe putc(c, fp) do { int x = (c); fp->pos < fp->capa ? fp->fp[fp->pos++] = x : fputc(x , fp); } while(0)
>>819 int x; for (x = 0; x < 256; x++) putchar(x);
整数値をstdinから読み込むとき scanf("%d%c" , &hoge , &damy) ; と fgets(buff , sizeof(buff) , stdin) ; sscanf(buff , "%d" , &hoge) ; となら どっちが安定ですか?
>>818 struct node {
int nodekind ;
union {
struct {
int childs ;
struct node *child[MAX] ;
int low[MAX] ;
} internal ;
struct {
int leafkey ;
int data ;
} leaf ;
} u ;
} ;
#define CHILDS u.internal.childs
#define LEAFKEY u.leaf.leafkey
使っとけ
>>822 安定って意味がわからんが、一般的には下のほうが良いとされている。
>>822 せっかく
>>1 にC FAQのリンクがあるんだから、隅々まで見てきなされ
>>824 scanf("%d%c" , &hoge , &damy)
こいつだと起きそうな不具合ありますかね?
葉鍵?
>>821 あー、Compilerだけで使いたい変数・関数はアンダースコアで使う。
プログラム側はつかっちゃだめとかあったような。
ちなみに、ローカル変数は名前重複可能って、++だけだっけ?
>>828 ブロック内で定義された変数はその外部に影響しないから名前の重複は無問題。
>>826 数字の後にすぐ改行があるとは限らない。
>>822 要求仕様ではbuffの中の食べ残しをどうすることになっている?
>>828 アンダースコアなんて気休めにもならないよ、
ベンダとユーザの境界は常に1つじゃないんだから。
例えばSystemCなんてどっちになる?
ちなみに、ローカル変数だって1つの式の中で2回++はだめだよ。
int giko;
void mona(void)
{
int giko;
{
int giko
}
}
キミが聞いたことあるのは
おそらくこれがOKってだけのことだろ。
その++じゃないだろ〜
>>829 処理系定義のマクロがアンダースコアで始まる変数や関数を参照していたら?
>>822 例えば、以下のようなコードの場合、
#include <stdio.h>
int main(){
int hoge;
char damy;
scanf("%d%c" , &hoge , &damy);
printf("hoge'v value = %d \n",hoge);
scanf("%d%c" , &hoge , &damy);
printf("hoge'v value = %d \n",hoge);
return 0;
}
実行結果は以下の通り
./a
1234
hoge'v value = 1234
a
hoge'v value = 1234 <- 前の奴が残っている
835 :
デフォルトの名無しさん :03/07/20 00:02
>>834 scanfの戻り値チェックシヨーネ
sscanfとか関係ねー
何言ってるんだ?
837 :
デフォルトの名無しさん :03/07/20 00:20
>>836 scanfの戻り値はパースに成功した引数の数
damy が恥ずかしいな
恣意的には、恥ずかしいのはこれで >int main(){ >damy は、恥ずかしくない。
好きな女の子の名前付けたっていいじゃんかよう!ヽ(`Д´)ノ ウワァァン
釣りか? 釣りだな? 釣りなのか? 釣りなんだろ? 釣りなんですか?
C調言葉なら俺に聞け!
C調て。オサーンですか?
サザンだろ
845 :
デフォルトの名無しさん :03/07/20 01:59
>>816 JISの規格書にはっきりと書かれている
7.9.7.9 putchar関数
機能 putchar関数は、第2引数としてstdoutを指定したputcと等価とする。
7.9.7.8 putc関数
機能 putc関数は、fputcと等価とする。ただし、マクロとして実装されたputc関数は、streamを2度以上評価することがある。したがって、実引数streamは、副作用を伴わない式でなければならない。
あ、、しまった。二度以上評価するのはstreamか・・・・
ということは
>>812 はなんら問題ないわけだから、812は何をいいたかったんだろう・・・
848 :
デフォルトの名無しさん :03/07/20 02:32
>>847 全てのコンパイラがJIS準拠だと思ってる香具師はDQN
つまり、 FILE **fp; の時に putc(c,*fp++); みたいな使い方は駄目って事か 正直、知らんかったな… まぁ、普通に書いてて、そんな書き方する事はないけど…
JISの規格とANSIの規格は違うの?
ただの翻訳
読み方 : ジス フルスペル : Japan Industrial Standard 工業標準化法に基づいて、すべての工業製品について定められる日本の国家規格。コンピュータと情報処理はX部門にまとめられている。 読み方 : アンシ、アンジー フルスペル : American National Standard Institute アメリカ国内の工業製品の規格を策定する団体。1918年に設立された。日本のJISにあたる。
そこで何故ISOの解説がありませんか。
>>854 しーーーーっ!
せっかくオモロイのにぶち壊すなよ
857 :
デフォルトの名無しさん :03/07/20 10:54
(,,*゚o゚*)<
858 :
デフォルトの名無しさん :03/07/20 10:57
(,,*゚o゚*)< ふぇろもん!
C的には
mainを他の関数から呼び出すことはないからint main()でもいいと思うけど・・・
>あるいは、int main(int,char **,char **)か。 ワラタ
863 :
デフォルトの名無しさん :03/07/20 17:28
ポインタで詰まってます。 間接参照でしたっけ。よく分かりません。 説明してもらえませんか? #include <stdio.h> int main() { int *po , var; var = 100; po = &var; *po = 1010; printf("変数varの値 = %d" , var); return 0; }
>>863 そのコードを100回くらい読み直してみろ。
メモリのどこかにint型の領域がある。 普段は名前(var)でアクセスする。 &を付けるとアドレスを返す。 ポインタ(po)にはアドレスが入る。 ポインタに*をつけると名前(var)でアクセスしたのと同じようにアクセスできる。
メモリっていうのは address と value で出来ていて、 int var で宣言された変数 var は value を持つんだけど、 int *po で宣言された変数 po は address を持つことが出来る。 ゴメン、上手く説明出来ないや。アーキテクチャを学ぶと良いかも。
867 :
デフォルトの名無しさん :03/07/20 17:58
>>863 そのコードだと、poにvar(=100)のアドレスを格納した後、
poの指す先(var)を改めて1010に設定していることになる。
だから、vsrの値も100から1010に変更され、1010が表示された。
アセンブラを先にやってるとptr+=sizeof(int)とかして悩んだり悩まなかったり(w
870 :
デフォルトの名無しさん :03/07/20 19:07
po = &var; //varの値(100)をポインタ変数poに代入 *po = 1010; //? うわぁ、分からないヽ(`Д´)ノ
871 :
デフォルトの名無しさん :03/07/20 19:30
ポインタというのは2つの要素から出来ている。 1つはアドレス。もう1つは参照先の型。 アドレスというのはメモリ上の位置のこと。 そのポインタを入れることの出来る変数がポインタ変数で、 int *po; のように宣言すると、po がポインタ変数になって、 参照先の型は int であると仮定される。 ある変数のポインタは & を使えば得られる。 例えば int var; の var のポインタが欲しければ &var とすれば得られる。 これを po に入れるには、普通の代入 po = &var; を使えばいい。
>>870 >po = &var; //varの値(100)をポインタ変数poに代入
違う。
さて、ポインタがあると何が出来るだろうか。 メモリ上の位置と、その型が分かっているので、 そこの値を参照したり、そこに値を入れたりすることができる。 それを行うには * というものを使って *po = 100; とか printf("%d\n", *po); とかすればいい。 *po とすると、po の中に入っているアドレスを始点とした int のサイズの領域を参照することができるのだ。
で、ポインタと普通の値との違いを見てみよう。 例えば int var = 100; int num; だとして、 num = var; としたとしよう。 この場合、num に渡されるのは 100 という値だ。 つまり、var と num という二箇所にそれぞれ 100 という値があることになる。 この場合、var++; としても、var は 101 になるが num は 100 のままである。 一方ポインタの場合は渡されるのはメモリ上の位置であって、値そのものではない。 つまり、100 という値が入れられた場所は相変わらず var の一箇所のみである。 位置を共有しているので、var++; とすれば var も *po も 101 になるし、 同様に (*po)++; とすると var も変わる。 なぜなら、var と *po はメモリ上の同じ領域を表しているからである。
877 :
デフォルトの名無しさん :03/07/20 19:46
*po = 1010
最後の一文はその前の文の先頭と同じこと言っちゃってた。スマソ。
#include <stdio.h> int main() { int *チャンネル , 番組; 番組 = めざましテレビ; チャンネル = &目覚ましテレビ; //チャンネル = 目覚ましテレビのチャンネル *チャンネル = 僕だけのマドンナ; //このチャンネルの番組 = 僕だけのマドンナ printf("変数番組の値 = %d" , var); return 0; } 上手く説明できんなぁ
880 :
デフォルトの名無しさん :03/07/20 19:54
*(アスタリスク)は単体ではなく型の一部です。 つまり int *i;とあると、アドレス型の入れ物に&(アンパサンド)でアドレスを 抽出していれる。そうすると、iはそのアドレスを示すのです。 つまり *iではなく、int *であってiはただの入れ物です。
881 :
デフォルトの名無しさん :03/07/20 19:56
po = &var; // *po = 1010; // これにコメントを付けてみると・・・
では、このポインタを使うと何が出来るのだろう。 大きく分けて、ポインタには 4 つの利用法がある。 1. 関数を超えてメモリを共有したい。 別の関数に大きなサイズをもった値を渡したい場合や、 特にサイズの決まっていない値(配列)を渡したい場合は、 ポインタだとサイズが小さくなるので便利である (配列そのものはそもそもポインタを使ってしか渡せない)。 また、別の関数内で変数の値を変更させたい場合にも利用できる。 普通に関数に渡しただけでは num を使った例で num の値を変えたところで var の値が変わらないのと同じように、 仮引数を操作しても実引数に渡した変数の中身は変えることができない。 でも、ポインタを使えばこれを解決することが出来る。 2. 動的にメモリを確保したい。 malloc という関数を参照。今はまだ気にすることはないと思う。 3. 特殊なデータ構造を実現したい。 リスト構造、木構造などを参照。これもまだ気にすることはないと思う。 4. 参照したいメモリの位置を得ることが面倒な場合に、そのアクセスを簡単にする。 例えば a[foo(n)][bar(b * n + c)] を何度も参照したい場合には、 このポインタをポインタ変数に入れておけば、そのポインタ変数を使って楽に操作できる。 strchr などの関数の戻り値を保存しておくことも良くある。
883 :
デフォルトの名無しさん :03/07/20 20:31
みなさん、どうも説明ありがとうございます。 でも、po = &var; *po = 1010; の意味がやっぱりイマイチです。 プリントアウトして寝るまで考えてみます
884 :
デフォルトの名無しさん :03/07/20 20:48
間接参照自体はプログラムの中でよく使われるのですか? ヽ(`Д´)ノ
poはポインタです。アドレスを蓄えてくれます。 &はアドレスを教えてくれます。 po = &var;でvarのアドレスがpoに蓄えられます。 *はすごいです。実際にアドレスのところまで連れていってくれます。 poはアドレスが代入されて、アドレスを返しますが、 *poは(poに蓄えられたアドレスのところに)代入もできるし、 そこから値をとりだすこともできます。 *po = 1010;はvar = 1010;と同じになります。
で,*って記号はなんて読むの? nullって読んだらいいのかな. ってことは*po = nullpo ≒「ぬるぽ」?
887 :
デフォルトの名無しさん :03/07/20 21:01
アスタリスクだっけ。
*po = 1010; でなんでvarの値が変わるのかわからんのです
poにvarのアドレスが入っていると *poへの代入はvarへの代入をする。
poの中の人はvarなんだよ
varへの代入があったときに CPUはvarのあるアドレスを使って処理をするわけ。 それができるようにコンパイラが変換してる。 アドレスの値そのものをいじくるんじゃなくて アドレスを使った処理をする時に*を使うの。
int *po; のときpoはポインタで*poは実体、であってる?
正しいアドレスを指してれば、あってるよ。
(゜д゜( 人 ) =3 プ
int po = NULL; *po = 10; ぬるぽ
896 :
デフォルトの名無しさん :03/07/20 22:44
言いたい事わかるけど そのソース間違ってるよ
>896 あっ。ポインタになってない 鬱
>>863 中学生か?マルチもほどほどにしとけよヴォケ
遅っ
1)以下の式を中央差分を使って計算するプログラムを作成してください。df(x)/dxを 計算する。 f(x)=ax*x+bx+c 係数aは10、bは5、cは2とします。答えは、2ax+bになるはずなので数値的に微分した 結果と解析的に求めた値を比べて、計算が正しく行われていることを示してください。 計算範囲は0から2までとします。分割数は各自決めてください。(十分正確に計算できるように) 2) 台形公式を使って、1)の式を積分計算してください。積分範囲は0から2とします。 解析的な解も計算して、数値計算結果を比較してください。a、b、cの値は1)と同様とします。 以上のプログラムと実行結果をお願いいたします. もう完全にギブです。(T-T)どうかどなたでもよろしいのでお助けください。
>>901 前もそんな系統の質問があったな。
法線を求めるって奴で、外積を使う奴だったような…
で、その時も答えたがプログラム的には簡単だ。
君に微積分の知識がないだけだ。
数学を勉強しなさい。
(今回はヒントコードすら面倒)
904 :
デフォルトの名無しさん :03/07/21 00:30
コードをできるだけ短く書くこつを教えてください
同じ処理は関数にまとめる。
変数名や関数名は1文字〜2文字。 マクロを多様。 #define I if #define E else #define F for などなど…
おまえが知ね
909 :
デフォルトの名無しさん :03/07/21 01:13
911 :
デフォルトの名無しさん :03/07/21 01:36
スレッドで質問があります。 A,B,Cの3つの処理があって、ABはどっちを先に処理してもよくCはAB終了後でないとだめ。 ここで、A,Bをスレッドにしたいんですが、A、Bが終わるまでCの実行は待たないといけません。 この「A、Bが終わるまで待つ」ことのやり方がよくわかりません。 自分で試してみたのは、チェック用の外部変数を用意して check=0; _beginthread(A); _beginthread(B); while(check!=2); C; こんな感じでやってみました。AとBは終了するときにcheckを1増やします。 簡単なテストプログラムを作ってみたところ上手く動いたのですが、本当にこれでいいのか不安です。 とくに、ABが終わるまでひたすらループで待ち続けるのは、無駄にCPU使ってそうで もっとスマートな方法があるんではないかと。
>>910 限りなくVCの香りがするのは気のせいか?
>>911 マルチタスク(スレッド)のOSには必ずそれを
管理するオブジェクトやAPIが用意されている。
それを利用した方がいい
>911 mutex, condition variable
今はVCで作ってるけど、できればLINUXでも動く方が望ましいんです。 調べてる途中でmutexとかも出てきたんですけど、どう使えばいいかわからなくて。 今思いついたんですけど、 1、AとBの実行直後に適当な変数にロックをかけて終了時にロックを外すようにする。 2、Cの前でロックかけられてるやつにアクセスする。 こうすれば、AとBが終了するとともにロックが解け、Cが実行される。 というのでいけるかな?明日試してみます。
916 :
デフォルトの名無しさん :03/07/21 02:09
うぉおおおおおおおおおおおおおおおおおおおおおお めちゃ便利 これから毎日使う! vi _906.h $cp _906.h /usr/include
>>915 win32用のpthreadがある
それつかえばlinuxでも動くはず
pthreadはオライリーの本がちゃんとあるので嫁
% rm -f _906.h pthread_join 見てみたけど、 ライブラリとして void** を使ってるのはいかがなものか。
void *へのポインタならvoid *に入ると思うんだけど。。。
921 :
デフォルトの名無しさん :03/07/21 02:31
最近c始めたんですけど #include <stdio.h> main() { int ja; /*国語のテストの点*/ int ma; /*数学のテストの点*/ int en; /*英語のテストの点*/ int ave; /*平均点*/ ave = ( ja + ma + en ) /3; printf("三教科の平均点は%dです。\n",ave); } こう書いてコンパイルすると平均点が47点になるんですけど… よく分りません。なんで47点? だれか親切に教えてください。
>>921 初期化してない変数の値は激しく未定義だYO!
923 :
デフォルトの名無しさん :03/07/21 02:33
>>921 初期化していない自動変数にはどんな値が入るか分からない。
>>921 1. 初期化してない変数には、どんな値が入っているか分からない。
2. 整数同士の割り算では、余りは切り捨てられる
(但し、片方が正で片方が負の場合の結果は環境依存)。
#define I int main() I { }
#define I2 int main(int argc,char *argv[]) I2 { }
>>923 お、そうだった。
静的変数だと 0 で初期化されるね...。
929 :
デフォルトの名無しさん :03/07/21 02:38
#define I int main(int argc,char **argv,char **env) #define C printf("%s\n",env[0]); I { C }
int variable1 = 10; /* 初期化ぽ */ int variable2; variable2 = variable1; /* 代入ぽ */
>>929 int ja = 78; /* 初期化 */
int ma = 100; /* 初期化 */
int en;
int ave;
en = 82; /* 代入 */
ave = (ja + ma + en) / 3; /* 代入 */
ケコーンしまくり
>>929 初期化(脳内C言語事典78ページより)
変数を参照(使用)するより前に、何かしらの値を入れる事
分かりました!! アリガト!(´▽`)
>>934 確かに代入においても参照されるといえば参照されるのだが、
誤解されそうな定義なので却下。
初期化(脳内C辞典201ページより)
変数を宣言すると同時に何かしらの値を入れること。
もう次スレの時期なんでつか?早いでつね。
938 :
デフォルトの名無しさん :03/07/21 04:09
char buf[256]; #define TRACE(_msg_) strcpy(buf,"_msg_"); とやったマクロを使うと失敗してしまうのですが これを回避する方法ってあるのでしょうか? 11.17を読んだのですがわかりません
>>938 #define TRACE(_msg_) strcpy(buf,#_msg_);
#define TRACE(_msg_) strcpy(buf, #_msg_);
本日3度目のケコーン。
struct bumon { char *name; int bangou,total; } *part_ptr,part; のように宣言して他の関数で while(!feof(fp)) { part_ptr = (bumon *)malloc(sizeof(bumon)); fscanf(fp,"%d",&(part_ptr + bumonsuu)->bangou); fscanf(fp,"%s",*(s + )); printf("%d %s\n",(part_ptr + bumonsuu)->bangou,*s); if(feof(fp)) break; bumonsuu++; } というのがあるのですが printfとかfscanfで*nameを使うにはどうすればいいのですか?
その前に name の参照先はどこよ?
あと、めっちゃメモリリーク&不正アクセスしてる悪寒。
何が悪いのか分かりました。 char *nameと宣言すれば配列になると勘違いしてました 参照して、値入れなきゃ駄目なんですね。
アメリカで神棚て...。
949 :
デフォルトの名無しさん :03/07/21 06:13
#include <stdio.h> int main() { char str[] = "hello,world"; printf("str[0]の内容\t\t= %c\n" , *str); printf("str[0]のアドレス\t= %x" , str); return 0; } このプログラムの意味が分かんないです。 コメント付けてもらえないでしょうか
>>942 >part_ptr = (bumon *)malloc(sizeof(bumon));
struct bumonな
もしかして、そのソースの拡張子がcppになってるか?
Cを憶えるのにC++で翻訳してると嘘を教え込まれるぞ
それからsizeofにはbumonsuuのとりうる最大値+1を掛けてないのに
>fscanf(fp,"%d",&(part_ptr + bumonsuu)->bangou);
は無理だろ
>>949 #include <stdio.h>
int main() { /* 引数がないことを示す表記は (void) で () は誤り、ブレースの開き方がK&Rや規格票と違う */
char str[] = "hello,world"; /* 初期値のある配列はなるべくstaticにせよ */
printf("str[0]の内容\t\t= %c\n" , *str); /* 入門用サンプルならprintf("%c", str[0]);が適切な表記 */
printf("str[0]のアドレス\t= %x" , str); /* 入門用サンプルならprintf("%x", &str[0]);が適切な表記 */
return 0;
}
>>950 まぁ、それ以前の問題なんだがな...。
長さ不定の場合は、リスト構造にするか、
ある程度の配列を確保して足りなくなったら伸長するのがいいっぽ。
先頭から順番にアクセスするだけなら前者、
[ ] 使ってランダムアクセスしたければ後者、だな。
>>951 %xを使っていることに対してはつっこまないのか?
初期値のある配列はなるべくstaticにせよ。か。へぇ〜 参照のみの配列はなるべくstatic constにせよ。なら話は分かるけど。
958 :
デフォルトの名無しさん :03/07/21 11:32
>>883 po = &var; // poというカードにvarの住所を書き込む
*po = 1010; // poのカードに書いてある住所に1010を持っていく。
だろ?
さーてうめますか。
961 :
デフォルトの名無しさん :03/07/22 15:45
埋めるんならageとくか。
糞スレ〜〜〜ッ!!ばっo(⌒▽⌒)oか〜♪ハジメマシテ〜〜〜ッ☆☆(*⌒ヮ⌒*) なんで厨房って言われてるかしってるのぉ〜〜〜っ?(#⌒〇⌒#)キャハ うーんとー、私ぃすっごくすっごく暇でー、\(⌒∇⌒)/ 探してたら(◎_◎)なんとっ!☆彡(ノ^^)ノ☆彡ヘ(^^ヘ)☆彡(ノ^^)ノ☆彡 馬鹿みたいな掲示板♪を発見!!!!(^o^)//""" パチパチパチ さ・む・い〜{{ (>_<;) }} ブルブルすごい数のレスがありますけど、 これ全部1人の方がレスしているんですか?(@@;)すごすぎ … てなわけで、ついつい書いちゃったのらー(o^v^o) エヘヘφ(`∇´)φカキコカキコ♪ 削除以来、出してくれるよねっ。(*^-^*) お・ね・が・い♪(* ̄・ ̄)ちゅ♪ッ え?くれないのぉ〜?(;¬_¬)そんなのいやいや〜〜、ガ━━━(゚ロ゚)━━━ン 出してくれなかったら、( `_)乂(_´ ) 勝負! \(^o^)/ ☆○(゜ο゜)o ぱ〜んち、☆(゜o(○=(゜ο゜)o バコ〜ン!!( ゚▽゚)=◯)`ν゚)・;'パーンチ (>_<) いてっ!ダメ!! ゛o(≧◇≦*)oo(*≧◇≦)o″ダメ!! (☆o☆)きゃ〜〜(@_@;)やられた〜〜(o_ _)o ドテッ ガ━━(゚Д゚;)━━ン! (+_+) 気絶中。。。。・゚゚・o(iДi)o・゚゚・。うぇぇん <(゜ロ゜;)>ノォオオオオオ!! (゚□゚;ハウッ! なあんて(#⌒▽⌒#)こんな私っ!σ(^_^)だけど、(///▽///) お友達になってm(_ _)mくださいませませ♪('-'*)フフ ドガ━━━Σ(ll◎д◎ll)━━━━━ン ということで。(^-^)vじゃあね〜〜〜♪(⌒0⌒)/~~ ほんじゃo(゜▽゜ヽ)(/゜▽゜)o レッツゴー♪ あ、怒ってる? に・げ・ろ〜C= C= C= C=┌(^ .^)┘ (*^-^*)ノ~~マタネー☆'.・*.・:★'.・*.・:☆'.・*.・:★
free(malloc(1024));
for(;;) fork();
なるほど、落ちるタマか
お年玉キボンヌ
double d=0.0; for(1){ if(d==0.9) break; d+=0.3; } !
double d=0.0; while(1){ if(d==0.9) break; d+=0.3; } !
int di = 0; while(1){ double d = di / 10.0; if(di == 9) break; di += 3; }
埋めるんじゃねーの?
int main(){ const char* c="埋めるんじゃねーの?"; int i=0; while(i<29){ printf("%s\n",c); i++; } retrun 0; }
う
>>973 なぁんだのなんだは何を期待してたんだ?
め
ず
り
>>974 いや、FPUのバグとかそっち系かと
int naan(int anna) { if(anna <= 0) return 1; return naan(naan(naan(anna - 2) / 2) >> 2); }
ナーン
nuun
兄「おい、もっと開けよ。よく見えないだろ」 妹「これ以上はダメ。恥ずかしいもん」 兄「小学生のころはよく見せ合いっこしたろ」 妹「あのころはまだ子供だったから・・・。私もう中学生なんだよ」 兄「親父には見せたんだろ、オレにはダメだっていうのかよ!」 妹「だってパパは・・・」 兄「じれったいな。オレが開いてやるよ!」 妹「ダメ、お兄ちゃん、ああ・・・」 兄「すげぇ、小学生のときとは全然ちがう」 妹「やめて、そんなに開いたら全部見えちゃうよ・・・」 兄「なんか複雑になってる」 妹「あたりまえでしょ、中学生になって科目も増えてるんだから」 妹の通信簿を無理矢理見ようとする兄。
・・・
≡ (゚∀゚ ) ≡ 〜( 〜) ≡ ノ ノ
( ゚∀゚) ≡ (〜 )〜 ≡ \\ ≡
ぬるぽ
>987ガッ
鵜メール
あとじゅ。
neuf