1 :
('A`) :
2008/01/23(水) 19:12:56
printf("1乙\n");
for( ; ; ){ puts("1乙"); }
while(1){ scanf("%c",&command); switch(command){ {case'a'〜'c'} case'd': {exit(0);}←?? default{} }}} a〜cはプロトタイプ宣言した関数の呼び出しです。 dのときだけreturn 0;に飛ばしてループを終了させたいんですけどbreak使うんですかね? このexit(0)を使うやり方だとどうもループさせた時に入力エラーが一回余分に出てしまいます;
return 0; はどこですか
入れるとしたら default{…;} }(1)}(2)} (1)だと繰り返さず終わってしまうので(2)の方を考えてます。
やりたいことがよく分からない。 直接 return 0; したらだめなのか?
>>6 何をしたいのか整理してくれないか?
ついでに、擬似コードをやめてC言語で書いてくれ
うーん、擬似コードがよくわかりません。そのまま書いたつもりなのですが… あと一番上のscanf(%c,command)の%cを%xに、 case(a~d)を1~4に変えることで正常に作動させることができました;
・・・お前の持っているCコンパイラは case'a'〜'c'} こんなコードもコンパイルしてくれんの?
KY
1~4って5だけどいいの?w
それは 1^4 。 1~4 はコンパイルエラー。
ついでに文句いうなら無限ループはwhile(1)よりfor(;;)のがいいよ 優秀なコンパイラたんだと警告だす
それはむしろ無能だろ。 while(1) のみ定型句と見なしてエラー出さないくらいしてくれ。
それはもう数年後に出る人工知能つきコンパイラたんにご期待ください
int flg = 1; while(flg){ scanf("%c",&command); switch(command){ case 'a': case 'b': case 'c': break; case 'd': flg = 0; break; default: } } だせぇ・・・ while(command!='d')やらwhile(command)も考えたがダサい。 なんか上手いやり方ないか?
まず何をやりたいのかをまとめてくれ。
21 :
デフォルトの名無しさん :2008/01/23(水) 22:12:07
float f; scanf("%f", &f); printf("%f",f); で、実行して、fに100.1とか入力すると、 100.09998とか表示されてしまうんですが、何故なのでしょうか?
打ち切り誤差
23 :
デフォルトの名無しさん :2008/01/23(水) 22:14:35
double ならある程度マシにはなる。 それもいやなら固定小数点でググれ。
printf("%.1f",f); でごまかす
固定小数点でも同じだろ。
10進固定小数点なら大丈夫だろ。 100.1 に関しては。
「10進固定小数点」とか新語を作るなよ。
BCDと固定小数点がごっちゃになってるやつ多いな。
例えば10倍の下駄をはかせばいいだけだろ?
31 :
デフォルトの名無しさん :2008/01/23(水) 22:30:58
すみません、21ですが、 誤差はしょうがないということでおkですね。
常に値を 10 倍した形で int 型で扱えば大丈夫。
33 :
デフォルトの名無しさん :2008/01/23(水) 22:37:39
質問です。 #include <stdio.h> int main(void) { static char *month[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int i; char *p; for(i = 0; i < sizeof(month)/sizeof(month[0]); i++){ for(p = month[i]; *p != '\0'; p++) if(*p == 'r') break; if(*p != '\0') puts(month[i]);} return 0; } これを小文字のrだけじゃなく大文字のRも大丈夫なようにするにはどうすればいいのでしょうか?
'R' とも比較する
toupper((unsigned char)*p) == 'R'
>>33 if((*p == 'r') || (*p == 'R'))
tolower()
if(*p == 'r' || *p == 'R')
あぁ成る程。||を使えばよかったんですね。 どうもありがとうございました。
scanf()で文字を読み込むときに\nが残るってはなしじゃねーの?
40 :
デフォルトの名無しさん :2008/01/24(木) 06:17:38
void wall(int p,int q) {if (meiro[p][q]!=1) {int dir; meiro[p][q]=3; dir = rand()%4+1; if (dir==1&&meiro[p+2][q]!=3) {meiro[p+1][q]=3; wall(p+2,q);} if (dir==2&&meiro[p-2][q]!=3) {meiro[p-1][q]=3; wall(p-2,q);} if (dir==3&&meiro[p][q+2]!=3) {meiro[p][q+1]=3; wall(p,q+2);} if (dir==4&&meiro[p][q-2]!=3) {meiro[p][q-1]=3; wall(p,q-2); }}} p,qはmeiro[p][q]に対応していて、meiro[偶数][偶数]の点です。 迷路を自動生成するプログラム作ってます。 色々調べて壁伸ばし法で作ることにして、wall関数なるものを自作しました。 0:道 1:壁 3:作りかけの壁 一応、迷路っぽいものはできるのですが、なんというかすかすかのものができてしまいます。
続きは?
>>40 C言語っつーよりアルゴリズムの問題だと思うけど、
どのみちそこだけ出されてもなんとも言えない
wallをどういう風に呼んでるかとか、
どのタイミングと条件でmeiro[x][y]を1にセットするのかとか
わからないと
しかしみずれえソースだな
>>40 伸ばす方向に壁ができてたらそれで終わりにしないで、空いている方向を選ぶようにしてみたら?
45 :
デフォルトの七資 :2008/01/24(木) 21:09:14
すいません初心者なんで教えてください。 for(j=0;j<=3;j++){ for(i=j+1;i<=4;i++){ if(a[j]<a[i]){ H=a[i]; a[i]=a[j]; a[j]=H; } } } この H=a[i]; a[i]=a[j]; a[j]=H; はどういう意味ですか?
Hを仲介してa[i]とa[j]を入れ替えてるんだよ
>>45 スワップ
aのi番目とj番目の要素を入れ替えてる
Hを、一時的に値を保持する箱として使用し、 a[i]とa[j]の値を入れ替えている。
49 :
デフォルトの七資 :2008/01/24(木) 21:18:41
左って何だ?
51 :
デフォルトの七資 :2008/01/24(木) 21:19:59
52 :
デフォルトの七資 :2008/01/24(木) 21:21:23
a[i] に与えた数値の並ぶ順です。
バブルソートだね
54 :
デフォルトの名無しさん :2008/01/24(木) 21:30:24
for(j=0;j<=3;j++){ for(i=j+1;i<=4;i++){ if(a[j]<a[i]){ H=a[i]; a[i]=a[j]; a[j]=H; } } } 半角スペース" "の変わりに、前角スペース" "を使うとずれないよ。
専ブラならポップアップさせればずれないものもあるよ
なら消えない半角空白が作れる。 と普通の空白を交互に置いてもいける。
ってコピペすると変にならね?
59 :
デフォルトの名無しさん :2008/01/25(金) 01:56:46
すみません!C言語初心者ですが質問です。 以下のプログラムをコンパイルしてみたところ、 よく分からないエラーが出ました。 #include<stdio.h> #include<stdlib.h> typedef struct{ char *word; int num; } BUCKET;//7行目 main(int argc, char* argv[]) { int i,j; if(argc<2){ printf("一つ以上の引数を入力してください\n"); exit(1); } BUCKET p[argc-1];//16行目 } ↓エラー内容 ・・・\kadai51.c(16) : error C2275: 'BUCKET' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。 ・・・\kadai51.c(7) : 'BUCKET' の宣言を確認してください。 ・・・\kadai51.c(16) : error C2146: 構文エラー : ';' が、識別子 'p' の前に必要です。 ・・・\kadai51.c(16) : error C2065: 'p' : 定義されていない識別子です。 ・・・\kadai51.c(16) : error C2109: 配列または、ポインタでない変数に添字が使われました。 OSはWinXP、コンパイラはVisualC++6.0を使用しました。 XPではCは正しくコンパイルできないのですか? 誰か教えてください!
>>59 >BUCKET p[argc-1];//16行目
VCでは可変長配列はサポートされてない。
というかC言語のつもりならブロックの途中に宣言入れちゃ駄目だよ?
ああC99なら途中で宣言してもいいのか どっちにしろVCはC99に対応してないけど
VC++6では配列の個数に変数は指定できない BUCKECT p[ 100 ]にしてみろ。 可変個にしたければmalloc使うかC++に乗り換えるか。
63 :
定数にして余分に取る :2008/01/25(金) 02:04:55
#include<stdio.h> #include<stdlib.h> typedef struct{ char *word; int num; } BUCKET;//7行目 main(int argc, char* argv[]) { int i,j; if(argc<2){ printf("一つ以上の引数を入力してください\n"); exit(1); } BUCKET p[10];//16行目 }
64 :
59 :2008/01/25(金) 02:07:12
あー・・・ではコマンドで設定した分だけを変数確保というのは できないんですね・・・ pを固定長にして試してみます。 どうもありがとうございました。
mallocしろよ
66 :
デフォルトの名無しさん :2008/01/25(金) 02:32:29
vector< BUCKET > p(argc); が初心者向け
67 :
67 :2008/01/25(金) 03:02:03
C++でプログラミングしていて、 main関数の中の途中で2次元配列を宣言したら実行時エラーになりました。 char hairetu[500][500];のように宣言したら、 abc.exeは動作を中止しました、と言って止まります。 この配列には代入も何もしていません。 宣言だけでエラーになります。 グローバル変数に移動するとそのエラーは消えました。 C++では変数の宣言はどこでも可能なはずですが、 なぜ実行時エラーになってしまうのでしょうか?
68 :
デフォルトの名無しさん :2008/01/25(金) 03:09:05
サイズがデカイ 250000バイト new vector つかえ
なにさっきからvectorとか言ってんだと思ったらC++かよ。 スレ違いだ。
70 :
デフォルトの名無しさん :2008/01/25(金) 03:11:12
char **p= new char [500]; for(int n=0;n<500;n++)p[n]=new char [500]; p[0][0]=100; ならできるはず
最後の p[0][0]=100; てのは何ざんしょ
72 :
デフォルトの名無しさん :2008/01/25(金) 03:32:17
代入してみた゜
73 :
デフォルトの名無しさん :2008/01/25(金) 04:08:42
Javaの授業で変数宣言は1行に複数宣言するのは危険だから1行につき1つの宣言にしろと言われたんですが、 これはC言語も同じなのですか?後どうして危険なんですか?
75 :
67 :2008/01/25(金) 04:19:27
char hairetu[500][500];で質問した67です。 68さん、69さん、70さん、71さん、72さん、 質問に答えてくれてありがとうございます。 私の質問はC言語でなくC++に関するものなので スレ違いでしたらすみません。 --- エラーの原因はメイン関数の中で500*500の配列は大きすぎるから、 ということでいいのでしょうか? グローバル変数の場所で宣言するなら事前に確保できるので エラーにならない、と。 メイン関数を走らせている最中に変数を確保するには newやvectorで確保する方がいい、ということでしょうか。
スレ違いだと言う点含め大体あってる
77 :
67 :2008/01/25(金) 04:40:16
76さんありがとうございます。 疑問が解決しました。みなさんありがとうございました。 また、スレ違いすみませんでした。
>>75 Cには以下の4つの領域があります。
コード(code)->プログラム
データ(data)->外部変数
ヒープ(heap)->malloc,new
スタック(stack)->関数の内部変数
このうち、スタック領域のサイズはデータ、ヒープより小さいく、大きな配列を
確保しようとすると最大サイズを超えることがあるということです。
>>73 たぶん言いたいことは宣言じゃなくて定義な。
Javaでそんな話は聞いたことないがCならポインタじゃないかなぁ?
int * hoge, fuga;とか
C99, Java, C++ などでは、変数を定義するときに同時に初期化すれば 自然と一変数ごとに一行となる。 構造体メンバ(やクラスのメンバ変数、フィールド)は、 きちんとコメントをつけると、一行ずつのほうが書きやすい。 ごくたまに、 int x, y; のように非常に関連性の高い変数を 同じ行で定義することもないわけではない。
#include<stdio.h> main{ char *month[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int i; for(i = 0; i < 12; i++){ if(*month[i] == 'r' || *month[i] == 'R') puts(month[i]); } } これで実行してみた所何も出てこなかったのですが、何ででしょうか?
牡蠣を食うつもりだったのか
strchr使え
86 :
デフォルトの名無しさん :2008/01/25(金) 15:00:24
2つの整数を入力した後、それらの最大公約数と 最小公倍数を求めなさい。 このプログラムをお願いします。
宿題スレに池。
2つの整数をa,bとする。 最小公倍数 ・aとbが等しいか比較する。 ・等しくない時aとbのどちらが大きいか比較する。 ・小さい方は自分の値を自分に足す。(a += a) 上を繰り返す。 最大公約数 a,bの小さいほうで両方を割る。 どちらかが割り切れなかったら小さい方から1引いた値で両方を割る 上を繰り返す。
90 :
デフォルトの名無しさん :2008/01/25(金) 15:14:18
>>89 a += aじゃまずいな。
a,bはとっておいて、計算用の変数に足していかないと。
>>86 #include <stdio.h>
int main(){
int x,y,r,t;
printf("x=");scanf("%d",&x);
printf("y=");scanf("%d",&y);
if(x<y){
int z=x;
x=y;
y=z;
}
t=x*y;
CHECK:
if(y==0){
printf("%d,%d",x,t/x);
goto END;
}
r=x;
MOD:
r-=y;
if(r>=y)goto MOD;
x=y;
y=r;
goto CHECK;
END:
return 0;
}
nを与えて和Sを求めるプログラムで S=1+(1+2)+(1+2+3)+-----+(1+2+3+---+n) で1重ループでならできたんですが 2重ループでの作り方が分かりません。 低レベルですが教えて下さい。
int i, j, s=0; for(i=1; i<=n; i++) for(j=1; j<=i; j++) s += j;
prime[ptr++]=2; これのptr++ってどういう意味ですか? ptrは[個数を記憶するもの]と分かるんですが =2とできる意味も分からないです。
primeに2を格納してptr++??
知ってます☆ けど、i++とかなら分かるけど prime[ptr++]=2 となると分かりません
知ってはいても、理解してないってことか。
>>99 prime[pt]=2;
ptr++;
まぁこういことだな
prime[0],prime[1],prime[3]…てことか!?
103 :
73 :2008/01/25(金) 18:54:01
>>79 >>80 解答ありがとうございます。
変数宣言じゃなく変数定義でした。
確かにCでは複数定義は危険ですね、JavaはCの書き方に依存してるのかな?
後で先生に聞いてみます。
prime[0],prime[1],prime[3]…てことか!?
prime[0],prime[1],prime[3]…てことか!?
PCおかしかった!同じレスすんまそ!
配列について学習しなおせ
108 :
デフォルトの名無しさん :2008/01/25(金) 21:17:18
>>92 Cでそんだけgoto使うと、なんか新鮮さを感じるね。
int i, j, ptr = 0, prime[N]; prime[ptr++] = 2; for(i=3; i<=M; i++) { for(j=0; j<ptr; j++) if(i%prime[ptr]==0) break; if(j==ptr) prime[ptr++] = i; } ループの中はちょっと違うかもしれんが、こんな感じで素数を求めてくプログラムかな。
以下のプログラムで、Inout dataの中で、"END"と入力されたら、入力終了する条件を追加したくて メインにアドレス返却する方法を使うみたいですけど、よく分かりませんm(_ _)m while文じゃ無理でしょうか? void input_data(Person *pmem) /* データ入力関数 */ { char buf[BUF]; while(1) { printf("\nName : "); scanf("%s",&buf[0]); /* 名前の入力 */ if(strlen(&buf[0]) <= NAME_MAX) /* 入力文字数のチェック */ { strcpy(&pmem->name[0],&buf[0]); break; /* メンバにコピー */ } printf("\nSorry. Input less than %d characters.\n", NAME_MAX+1); }
>>110 何言ってるかわからん。
>メインにアドレス返却する方法
って何のことだ?
>"END"と入力されたら、入力終了する条件を追加したくて
だけなら、strcmp()でいいはずだが。
もうちょっとやりたいことを整理しる。
intを返す関数にして、endが入力されたら0それ以外なら1を返すとかにして、 呼び出した方で処理すれば?
>>110 ついでに
scanf("%s",&buf[0]); /* 名前の入力 */
は
scanf("%s",buf); /* 名前の入力 */
と同じ。
&buf[0]を使うよりbufを使ったほうがすっきりするだろ
110です。 名前が20文字以上入力されたら再入力、ENDが入力されたら強制終了する条件式 を作りたいわけですけど、条件の書き方が分からないです
>>112 スミません。かなり初心者なので、処理方法でパニくってます
>>113 サンクス。勉強になりました
116 :
デフォルトの名無しさん :2008/01/25(金) 23:40:41
>>114 strcmpで"END"かどうか判断して、真だったらreturnすりゃあいいんでない?
自分自身の実行されている環境が windowsなのかLinuxなのか、プログラム中で 知る方法はないでしょうか?
>>117 (仮想環境のことじゃないよね?)
同じバイナリでWindowsでもLinuxでも動く、というようなことを
しようというのでなければ(可能か?)、コンパイル時に#ifdefで
__linux__ とかが定義されてるかどうかを見るのが一応簡単。
(Windowsでのコンパイルで-D__linux__とかやって
意図的に誤作動させることは可能)
>>117 普通、そういうことは使用とは思わない
バイナリを分ける
例の原田ウイルスはVBで作ってるみたいですがCでも頑張れば同等のものができるんでせうか
>>117 われわれが作成するmain関数の前に、コンパイルが組み込んだOS依存のコードが走る。
だから、Windows用にコンパイルしたプログラムをLinuxで実行しようとすると、main関数
に到達する以前に異常終了する。
と、思う。
124 :
122 :2008/01/26(土) 01:42:28
>>123 間違ったら指摘してね。試したことがないから・・・
>>124 説明するのもめんどくさいぐらい何から何まで間違ってる
>>122 そもそも実行ファイルの形式が違うので、
互いに実行を開始することすらできない。
Windowsでは環境変数が OS=Windows_NT と設定されてるからそれを調べればいい。まあふつーはビルド時にifdefするもんだが。
そうだ、実行形式のファイルとして認識されない。だろ?
いや、少なくともLinuxではWindowsの実行形式だと認識はできるよ。 但し、カーネルが詳細を知らないからロードさえできないけど。
constで配列の要素を定数化したのに関数の中で要素が書き換えられてしまうことってあるの?
131 :
130 :2008/01/26(土) 04:10:04
プログラムの一部を抜きだしたとき void x(a[], const b[], const c[]) { printf("%d",b[0]; a[i] = (10 + b[i]) - c[i]; printf("%d",b[0]) } このときの上下のプリントで違う値が出力されてしまうのですが原因が分かる方いませんか?
その部分だけではありえません。
iはどこからやって来たの?
>>131 いや、そんな動かないコード渡されてもw
>>131 ほれ。違う値がプリントされる例だ。
#include <stdio.h>
int i = 0;
void x(int a[], const int b[], const int c[])
{
printf("%d\n",b[0]);
a[i] = (10 + b[i]) - c[i];
printf("%d\n",b[0]);
}
int main()
{
int a[] = { 0 };
x(a, a, a);
return 0;
}
>>135 printf("%d %d %d\n",a,b,c);
137 :
デフォルトの名無しさん :2008/01/26(土) 10:27:38
>>135 a,b,cも同じアドレスを指しているから、a[0]の内容が10になれば、
b[0]も10になるんじゃないの。
>>135 に言ってどうすんだよw
わかってて一つの可能性を示してやってんだろ。
139 :
デフォルトの名無しさん :2008/01/26(土) 12:08:51
ファイルの低水準読み込みで、読み込み対象となるファイルの特定の位置から任意の サイズのバイトデータを、取り出すことは可能なのでしょうか? 例えばファイルの10バイト目から20バイト目までを読み込むというような事がしたい のですが、どなたか分かる方がいましたら教えてくれませんか?
規格外のこと言われても 環境示さにゃ分からんぜよ。
142 :
139 :2008/01/26(土) 12:13:23
すいません。 環境はFedoraCore8です。
本当に低水準だとセクタ単位で・・・
>>139 int h;
char buf[20];
h = open("ファイル名", O_RDONLY);
lseek(h, 10, SEEK_SET);
read(h, buf, 20)
close(h)
145 :
139 :2008/01/26(土) 12:25:32
>>144 ありがとうございます。
早速試してみます。
>>144 >例えばファイルの10バイト目から20バイト目までを読み込むというような事がしたい
>read(h, buf, 20)
にほんごよめますか?
Can you read Japanese?
10バイト目を起点にそこから20バイト分読み込むとも読めるから、 おかしくはないな。
こういう奴が仕様と違うへんてこなもんを量産してるんだろうな。
10バイト目から20バイト目まで読み込む 10バイト目から20バイト読み込む 10バイトから20バイトまで読み込む さぁ仲間はずれはどれだ >ファイルの特定の位置から任意のサイズのバイトデータを、取り出す って言ってるんだから、10バイト目から10バイト分読み込みたいって素直に書けばよかっただろうに
>>146 そういう場合は普通 Can は使わない。
Do you speak Japanese? でおk。
いや合ってるんじゃないか? Can you〜だと嫌味も軽く含んでいるから
"Can you speak English" で検索しても日本語のページしかひっかからないよ。 そんな表現自体無いんだよ。英語には。
そりゃ英語圏で Can you speak Englishのフレーズは使うわけねーだろwwwwwwwww
"Do you speak English" だと結構引っかかるよ
I don't speak Englishっていうからね。I can'tじゃなくて。
speakじゃなくてreadであることにも注目。
All your base are belong to us. HA-HA-HA-HA.
冗談や嫌みで言う事はあるかもしれんな。
つーかスレ違い。
Do you speak C Language?
↓何事もなかったかのように再開↓
6個の整数データを配列に読んで 大きい順に並べなさい。 #include<stdio.h> int main (void) { int i,j,m,a[6]; for(i=0;i<=5;i++){ scanf("%d",&a[i]); printf("%d",a[i]); } printf("\n"); for(j=0;j<=4;j++){ for(i=5;i>j;i--){ if(a[i-1]<a[i]){ m=a[i]; a[i]=a[i-1]; a[i-1]=m; } } } for(i=0;i<=6;i++){ printf("%d\n",a[i]); } printf("\n"); } 実行できないんですけどどこがおかしいですか?
>>164 ただ実行できないでなくて、何をしたら何がおきたかを正確に書け。
コンパイルしたらこういうエラーが出たとか。
こういう値を入力したのにこういう間違った結果が出たとか。
実行したらアクセス違反で落ちたとか。
鼻から悪魔が出てきたとか。
>>164 for(i=0;i<=6;i++){
printf("%d\n",a[i]);
}
な・・7番目だと・・・・・
i <= 5 って書いたりするから間違えるんだよ。
>>164 a[i-1]ってゆう、文字を、a[J]に変えてみると、いいかもしれませんと、ヒントです
>>165 整数は何個でも入れられて
実行してもばらばらにでます。
どの辺がヒントなのかと。
ワロタ
>>169 int main(void)
{
int i, j, m, a[6];
for (i = 0; i < 6; i++) {
scanf(" %d", &a[i]);
}
printf("\n");
for (j = 0; j <= 4; j++) {
for (i = 5; i > j; i--) {
if (a[i-1] < a[i]) {
m=a[i];
a[i]=a[i-1];
a[i-1]=m;
}
}
}
for (i = 0; i < 6; i++) {
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
>>173 ありがとうございます。
明日実行してみます。
175 :
子羊 :2008/01/26(土) 22:36:16
#include <stdio.h> #include <stdlib.h> #define BUFSIZE 100 #define MAX 100 #define TRUE 1 #define FALSE 0 #define NUMBER '0' #define EPS 1.0E-6 void push(double); double pop(void); int next(char []); int iswhite(char); int isnum(char); double str2no(char []); /* global variable, array, pointer */ int sp = 0; double stack[MAX]; char buf[BUFSIZE]; char *bufp = buf;
176 :
子羊 :2008/01/26(土) 22:43:22
main() { int type; double op2; char s[MAX]; while ((type = next(s)) != EOF) { switch (type) { case NUMBER: push(str2no(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 < EPS) { fprintf(stderr, "error: zero division\n"); exit(1); }
177 :
子羊 :2008/01/26(土) 22:44:44
else push(pop() / op2); break; case '\n': printf("\t%10.4f\n", pop()); break; default: fprintf(stderr, "error: unknown command %s\n", s); exit(1); } } } int isnum(char c) { /* 各自この部分を作る */ } int iswhite(char c) { /* 各自この部分を作る */ }
178 :
子羊 :2008/01/26(土) 22:46:39
void push(double val) { if (sp < MAX) { stack[sp] = val; sp++; } else { fprintf(stderr, "error: stack full, "); fprintf(stderr, "can't push %f\n", val); exit(1); } } double pop(void) { if (sp > 0) { sp--; return stack[sp]; } else { fprintf(stderr, "error: stack empty\n"); exit(1); } }
179 :
子羊 :2008/01/26(土) 22:47:36
int next(char s[]) { int i, c; if (bufp == buf) { if (fgets(buf, BUFSIZE, stdin) == NULL) { return EOF; } } while(iswhite(c = *bufp) == TRUE) bufp++; /* 各自この部分を作る */ } double str2no(char s[]) { double val, power; int i, sign; /* 各自この部分を作る */ return sign * val / power; }
180 :
子羊 :2008/01/26(土) 22:47:38
main() { int type; double op2; char s[MAX]; while ((type = next(s)) != EOF) { switch (type) { case NUMBER: push(str2no(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 < EPS) { exit(1); }
181 :
子羊 :2008/01/26(土) 22:48:12
void push(double); double pop(void); int next(char []); int iswhite(char); int isnum(char); double str2no(char []); double stack[MAX]; char buf[BUFSIZE]; char *bufp = buf;
182 :
子羊 :2008/01/26(土) 22:49:12
main() { int type; double op2; char s[MAX]; while ((type = next(s)) != EOF) { switch (type) { case NUMBER: push(str2no(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': push(pop() / op2); break; case '\n': printf("\t%10.4f\n", pop()); break; default: fprintf(stderr, "error: unknown command %s\n", s); exit(1); }
183 :
子羊 :2008/01/26(土) 22:53:17
逆ポーランド記法の式を計算するプログラムを作りたいんです。 (数値は0以上の実数)
184 :
デフォルトの名無しさん :2008/01/26(土) 22:53:59
以下の文のw1の値を√化してw2にしてからfにw2の値を入れたいのですがやり方がわかりません。 どなたか教えていただけませんか。おねがいします。 #include <stdio.h> #include <math.h> double func(double x) { double w1 = 0.1062 * x * (1 - 4.248 * 0.00001 * x * x); double f; return f = w2/(2*3.14); } void main() { int x = 4; double result; FILE* output; output=fopen("output.csv","w"); for(x = 4; x <= 50; x++) { result = func(x); printf("x=%d, f=%10.2lf\n", x, result); fprintf(output, "%d, %10.2lf\n", x, result); } fclose(output); getchar(); }
w2 = sqrt(w1);
スレ違いだクズ
187 :
子羊 :2008/01/26(土) 23:00:08
私ですよね?すいません
>>187 ソースが長い時はテキストファイルをどこかにあげろ。
お前のレスをわざわざコピペしてつなぎ合わせさせるのか?
しかもだれかのいたずらかmainがいっぱいあるしwww あげなおしたほうがいいかも
main関数あれだけあったらコンパイラたん困るだろ!
192 :
子羊 :2008/01/26(土) 23:21:06
すいません
困るのはリンカたんじゃまいか?
ファイルをわけてるかどうかで変わる
そんなに言うとエディタたんが責任感じるからやめろよ
8ビットの2進数を整数に変換しなさい。 #include<stdio.h> int main (void) { int i,a[8],x=0; printf("8ビットの2進数を入力して下さい:"); for(i=7;i>=0;i--){ scanf("%d",&a[i]); } i=7; while(i>=0){ x=x*2+a[i]; i--; } printf("%d\n",x); return(0); } 8ビットの2進数(0or1)入れても実行 できなかったんですがどこがまずいですか?
>>196 動いてるみたいだけど?
どう動かないの?
>>196 正常に動いてる。
8回入力してみた?
1 1 0 1 1 0 0 0 みたいに
>>196 strtol を使うってのは反則なんだろうな。
それはともかく、入力するとき桁をスペースなり改行なりで区切ってないとかか?
200 :
184 :2008/01/26(土) 23:56:35
%d はひとつながりの数値を取得する。
>>196 x=x*2+a[i];
xってずっと0入れんの?
計算できるか??謎
お前のレスが謎
>>201 getcharで取得すればいいよ。
そうすりゃループでも 改行いれずに1文字づつ配列に格納していってくれる。
でそれをatoiで整数に戻せばいいんじゃね
atoi は文字列から整数への変換だから getchar → atoi はまあできないこともないがひと手間かかる。 どうせエラーチェックなんて期待されてないだろうし、ただ '0' 引くだけでいいよ。
207 :
デフォルトの名無しさん :2008/01/27(日) 01:02:03
プログラム実行直後に「強制終了」てでるんですがなぜでしょうか 手がかりが無さ過ぎて困ってます
適当にブレークポイント置いてステップ実行してみれ。
>>207 デバッガでも使えば?
それだけじゃわかんねーし
デバッガ使え ないならprintf("dbg:%s:%d\n", __FILE__, __LINE__); をばら撒きまくってどこまでちゃんと実行できているのかチェックしろ
212 :
207 :2008/01/27(日) 01:08:25
デバッガないです mainの一番最初にprintfしてるんですがそれすら出力されません
ないです、じゃなくて手に入れてこいよ
>>212 main()ででかい配列を宣言してるとか。
>>212 お前を助けるための手がかりが無さ過ぎて困ってます。
>>214 static でもあんまりでかいと起動できない事がある。
コンパイラの対象環境が 自分の環境と違うとか
DLL がない場合はそういうエラーが出るだろうしなあ。
220 :
207 :2008/01/27(日) 01:30:00
違うマシンならなぜかちゃんと走るのですが、、、 コンパイラはgccでMake介してやってます。今までもこうしてきました DLLてなんですか もうすぐ卒論提出日 私オワりました
卒論を人に聞いて仕上げるぐらいなら卒業するな。
1月末が卒論提出締切日が多いな つーか今頃コンパイル云々言ってるようじゃ終わってる気が
223 :
デフォルトの名無しさん :2008/01/27(日) 01:33:17
00〜ZZまで連番を振りたいのですが、 00〜99まで来るとA0〜ZZという順番で振りたいと思っています。 なるべく楽に出来る方法はないでしょうか? よろしくお願い致します。
>>220 ソースをガシガシ削っていって、その現象の再現する最小のソースを作り出すんだ。
>>223 普通のn進数じゃないんだな。めんどくせ。
>違うマシンならなぜかちゃんと走るのですが 一応聞いておくけど、 コンパイルしてるのはどのマシンで、 動かないのはどのマシンだ?
>>220 まず、このプログラムが実行できるかどうかためしてみるんだ。
int main() { return 0; }
>>227 そうか。
バイナリを持って行ってるって可能性もあるのか。
>>223 99の次がA0ならA9の次は?
下の位にいつアルファベットがでてくるんだ。
>>223 AA〜ZZ じゃなくて A0〜ZZ なのか?
自分で作れば?
232 :
デフォルトの名無しさん :2008/01/27(日) 01:53:12
>>226 そうなんです。スマートにできればいいんですが、
N進数に直すのに数値を割ってごちゃごちゃしてしまいそうなので、
何かいい方法はないかと模索中です。
単純な文字処理でいけるだろ
可変100進数?それだけだと法則が分からん。
00〜99を作る。これができないようなら勉強をあきらめろ。 A0〜ZZまで出力するのを作る。 そして99まで来たらA0へ処理を切り替えればいい
普通の36進数なんじゃね?
>>223 が必要としてるのは?
99の次が9Aなら分かる だがなんで次がA0なのに最終的にZZになるんだw
char buf[1024]; とかで宣言されて、何度か使い回された後の buf を NULL で埋め尽くすにはどうすれば出来ますか? 素朴に行くと、forループで埋めるというのもありますが、他に便利な方法がありますか?
本気で言ってるのかよく分からないけど、memset
memset
>>238 memset()
ただ、memset(buf, NULL, sizeof buf); とかやると、ド素人ってのがバレバレになる。
memset
ポインタってわけじゃないならNULLで埋めないで素直に0で埋めようぜ
NULLは一応ポインタ用なんだっけ? 整数のが来るとこで使ったときは標準では未定義だっけ?
単なる36進数ならこんな無理やりでもOKだぞ。 char num[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for ( int i = 0; i < 36 * 36: i++ ) { printf ( "%c%c", num[ i % 36 ], num[ i / 36 ] ); }
逆にポインタ配列を NULL で埋める時に memset すると やっぱりド素人だというのがバレバレになる。 #if するなら構わんが。
247 :
245 :2008/01/27(日) 02:19:58
上の桁と下の桁が逆になったorz
NULLが0じゃない処理系もあることはある。
毎度毎度のそのネタ秋田
ああ、ここは C スレだったな。すまん。
仮にNULLが0だとしても用途がちがうから。
ビット配列が 0 なら特に問題はない。
memset(buf, SEEK_SET, sizeof buf); とか書いて、 「SEEK_SETが0以外の処理系ってあるんですか」とかゴネてるやつとかいたら、おかしいしな。
NULL で埋める時に memset すると、 という点を誤解してるんだろう。 まあ、俺も書いてて紛らわしいと思ったが。 NULL で埋めるつもりで 0 クリアすると、という意味だ。 memset(buf, 0, sizeof buf); みたいな。
256 :
デフォルトの名無しさん :2008/01/27(日) 03:24:03
socketプログラムで作るサーバープログラムについての質問があります。 例えば struct sockaddr_in server; ・・・ server.sin_port = htons(7743); server.sin_addr.s_addr = htonl(任意のIP); とするとポート番号は直接htons関数に渡せるのは分かるんですが、 任意のIPは直接渡せませんよね? 渡せる場合例えばホスト表記で168.192.77.43というIPだとどのように書けばいいのですか? また、渡せないとしたらIPを収めるin_addr構造体のs_addr変数にIPを収めると思うのですが、 例えばホスト表記で168.192.77.43というIPだとどのように代入すれば良いのでしょうか?
inet_atonとか使え。
258 :
256 :2008/01/27(日) 03:38:54
>>257 こんな便利な関数があったんですね・・
初心者丸出しで申し訳ないです。
ありがとうございました
ところでそのポート番号…いやなんでもないw
7743が標準のソフトといえば…げほごほ
261 :
256 :2008/01/27(日) 04:35:16
え、何かまずいポート番号なんですか? 名無しさんにちなんでつけたんですが・・
>>261 「7743 ポート番号」とかでぐぐればわかると思うよ
俺も知らんから調べてみたらwinny関係みたいね。
ちなみに(知ってる人は知ってるが)「名無しさん」なのだ。
>>265 ハハハ…。
ちなみに743にしなかったのは1023までがwell-knownだからなんだぜー。
…おやすみなさいorz
743じゃねぇ774だ ほんとやばいな・・さっさと寝よう・・・
268 :
232 :2008/01/27(日) 10:02:39
#include <stdio.h> int main (int argc, const char * argv[]) { // insert code here... int hp=100; int k; printf("魔王が現れた!!¥n"); while (hp>=0){ printf("攻撃してください¥n"); printf("1>爆弾,2>こん棒¥n"); scanf("%d",&k); switch (k) { case 1: printf("爆弾攻撃!!魔王に10のダメージ¥n"); hp=hp-10; continue; case 2: printf("こん棒攻撃魔王に5のダメージ¥n"); hp=hp-5; continue; default:printf("さあ早く"); continue; } printf("やった!!魔王を倒した¥n"); break; } return 0; } 一方的に魔王に攻撃するプログラムを作成したいのですが 実行すると最後の魔王を倒したが表示されずに終了してしまいます どうすれば良いのでしょうか お願いします
魔王を倒したをwhileの外に出せ
>>269 int main (int argc, const char * argv[])
{
// insert code here...
int hp = 100, k;
printf("魔王が現れた!!\n");
while (hp >= 0) {
printf("攻撃してください\n");
printf("1>爆弾,2>こん棒\n");
scanf(" %d", &k);
switch (k) {
case 1:
printf("爆弾攻撃!!魔王に10のダメージ\n");
hp -= 10;
break;
case 2:
printf("こん棒攻撃魔王に5のダメージ\n");
hp -= 5;
break;
default:
printf("さあ早く");
break;
}
}
printf("やった!!魔王を倒した\n");
return 0;
}
273 :
デフォルトの名無しさん :2008/01/27(日) 17:58:37
int k=1234; printf("K*100L=%1d",K*100L); と入力したら、なぜか「K*100L=1234000」と出ました。 「K*100L」の「L」はどこへ消えてしまったのでしょうか?
>>273 どうなるとおもってLつけたんだよwwww
Lはlong int 型であることを明示する
>>273 >int k=1234;
>printf("K*100L=%1d",K*100L);
>と入力したら、なぜか「K*100L=1234000」と出ました。
大嘘を書くな。或いはコピペくらいミスるな。
276 :
デフォルトの名無しさん :2008/01/27(日) 18:45:14
>Lはlong int 型であることを明示する K*100は「K*(long int)100」の省略形ってことでいいですか? >printf("K*100L=%1d",K*100L); すまんまちがえた。「printf("K*100L=%ld",K*100L); 」だった。
もちつけ
だから、なんで1234*100で1234000なんだYO!
279 :
デフォルトの名無しさん :2008/01/27(日) 19:41:03
あ、いやその。 C言語始めたばかりの超ビギナーで・・・
いや、算数の問題だぞ。
kとKのことかと思ったら算数が間違ってたのかw
282 :
232 :2008/01/27(日) 23:06:21
36進数を文字から数値に戻すことでお聞きしたいのですが、 地道に計算するしかないでしょうか? A9の場合、36*10 + 9とやれば答えが出るのはわかっているのですが、 教えて頂いた配列を使ったやり方が、目から鱗のシンプルさだったので、 同じくシンプルな実装方法があれば、是非ご教授お願いできないでしょうか。 よろしくお願い致します。
アルゴリズムのスレがあるからそっちで聞いたほうがいいのでは?
文字コードから 0〜35 に変換する変換テーブルを作ればいいと思うが、 どうせ文字セットに依存するコードになるのなら、 数字なら '0' を引いて、アルファベットなら 'A' 引いて 10 足すとかやった方が 分かりやすいんじゃないかと思う。
>>282 恐らくもっともシンプルな解はstrtolを使う。
286 :
デフォルトの名無しさん :2008/01/27(日) 23:34:55
2桁の10進数の値があります。 この値をを1桁目と2桁目の2つに分け、別の変数に入れたいです。 1桁目をA1 2桁目をA2のように。。。 どのような演算をしたらよいでしょうか。 ご教授ください。
287 :
デフォルトの名無しさん :2008/01/27(日) 23:35:36 BE:199692858-2BP(294)
char num[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; n = strchr(num, 'A') - num; n = strchr(num, '0') - num; 各桁を数値に変換するのはこれでできるけど。
検索はパフォーマンス的にどうなのよ
290 :
245 :2008/01/27(日) 23:44:55
>>282 これも無理やり感漂う方法な気もするけど、こんなのどう?
isalpha( num ) ? num - 'A' + 10 : num - '0';
ラッパ関数でも作ればシンプルになりそうだけど。
strtolの方がわかりやすいかな
291 :
232 :2008/01/28(月) 00:52:48
system関数を使って コマンドラインで実行しないといけないプログラムを自動化したいんだけど たとえば, system("programname login"); って実行したら,コマンドプロンプトの画面に User Name> と出てコマンド入力を求められます. 引き続きパスワードなども聞かれるのですが, system関数では実行処理が終わるまで制御が戻りません. このような追加入力が必要な場合どういうコーディングをすればいいの?
>>292 その入力が標準入力で、事前に入力項目が判っているなら
(つまりコマンドプロンプトでprogramname login < foo できるなら)
system("programname login < foo")とでもすればいい。
大抵の環境で巧くいくと思う。
入力項目を動的に変更したいなら大抵の環境でpopen()が使えると思う。
そうでないなら、大きく環境に依存することになるから
該当環境のスレ若しくは板で聞いたほうが早いかもしれない。
int s; int dx; int i; printf("f(x)=x^2について\n"); printf("x軸方向の刻み幅大:"); s=0; dx = 3/10; for(i=0;i<3;i=i+dx){ s=s+(i*i*dx); } printf("s=%d\n",s); 区分求積法やってるんですけどソース実行すると 途中で止まるんです… お願いします。。
3/10 は 0 つまりdx が0なので無限ループ。
intは整数値だから3/10とか代入しようとすると端数が切り捨てられ0になる。 それでforが無限ループになってる。 小数を扱う場合はdoubleを使え。
297 :
294 :2008/01/28(月) 15:02:11
298 :
292 :2008/01/28(月) 16:28:12
>293 返答ありがとうございます. >(つまりコマンドプロンプトでprogramname login < foo できるなら) これがうまくいかなかったので pp = _popen("programname login", "w"); fprintf(pp, "user"); fprintf(pp, "12345678"); _pclose(pp); 他サイトも参考にして,こうやって組んでみました, これだと,DOS窓は開くものの,追加入力と窓のクローズが 実行されません. 根本的に使い方まちがってますか?
>>298 使い方はあっていると思うけど、パスワード入力が標準入力じゃないんじゃね?
だとしたら、その方法はでは無理。パスワード入力で何が起きているか、Spy++ででも見てみたら?
unsigned char **in; このinをx方向にwidth,y方向にheight分だけずらした新しいポインタを得るには どうしたらいいでしょうか?
ポインタはリニアなものなのでx方向とかy方向とかはありません。
x とか y とか言われても・・・
in += width + height * MAX_WIDTH
** を width + height * MAX_WIDTH 進めてどうするよ
305 :
300 :2008/01/28(月) 21:54:07
unsigned char **in; で in[y][x] = (x, y)の画素 見たいな感じでデータが入ってるんですが. これをy, xだけ特定値分だけずらした新しいポインタが欲しいのですが
&& in[y][x]
そもそも、無理だろこれ。 unsigned char * を作る事は可能だが、 unsigned char ** は無茶。
309 :
300 :2008/01/28(月) 22:03:02
>>306 これは無理ですよね...あきらかに...
新しくallocしてコピーするしかないのかな...
そんなことしなくても、 width と height を保存する構造体作って、 in[y + size->height][x + size->width] を取得する関数を作っときゃいいんじゃね?
常にinを持ってればどの座標のポインタだって作れるだろうが。
普通は、1次元配列にしておいてxとyと幅からオフセットを計算するもんだが。
C言語を勉強して約半年・・・ いまだにコンパイラの細かい使い方がわかりません。 学習書などに書いてある「コンパイラのマニュアルを見て」 見てもさっぱり理解できません。できるのはコンパイルすることだけ マニュアルとかがわかりやすいコンパイラを誰か教えてください 書籍とかでもいいんですけど。 ちなみに今使ってるのは「.NET Framework SDK」です もしかしてスレ違いですか?
それはコンパイラじゃない・・・。
マニュアルをみてさっぱりわからないなら、プログラム全般の知識が足りないだけじゃね 初心者なら警告レベルと最適化オプションとパスとリンク関連のオプション覚えておけばいいんじゃね
VCとかつかってりゃコンパイルのマニュアルなんざ知らなくてもどうにかならね? F7押すだけなんだし。
設定なんて、ライブラリ導入した時に インクルードディレクトリやライブラリディレクトリいじったり、 マクロ定義したりする程度じゃね? 普通いじるとしても。
318 :
313 :2008/01/28(月) 22:31:20
なるほど・・・単純にレベル不足のようで;; 一年くらい前から0から独学で勉強を始めたのですが もう少し色んな知識を覚えないと駄目ですね
>>318 どちらかというと現状でいろいろと詰め込もうとしすぎている感じがする。
とはいえコンパイラとSDKの違い位は知っててもいいかな?
Wikipedia程度の知識でも初めは十分じゃね?
プログラムを作るときに何か外部のライブラリを使ってみればいいんじゃね リンクの設定やインクルードパスの設定をしないと使えないから 勉強になると思うぞ
321 :
313 :2008/01/28(月) 22:51:20
「.NET Framework SDK」は単純にC言語のコンパイラだと思ってましたorz
なんか共通言語でどうのこうの書いてあるから変だなと・・・
正直全然大したことはできませんが、色々試して勉強してみます
まずは
>>320 さんの言う通りにやってみようかな
322 :
デフォルトの名無しさん :2008/01/28(月) 23:40:43
C言語2級取れば Cの基礎は一通りは分かってる って扱いになりますかね? ならないか
基礎くらいはわかってる になるんじゃね? っつかCの世界だと実際にやってるかやってないかが一番重要だしなぁ
どこが出してる2級なの?
325 :
デフォルトの名無しさん :2008/01/28(月) 23:46:45
while文の実行条件で、 while(NULL)というのはFALSEと同じに考えていいのでしょうか?
別にいいけどwhileに0いれても意味ないだろ
>>325 顔面に硫酸ぶっ掛けられて
痛いとかではすまないだろ?
>>326 whileになんか式を入れてて、その値がNULLになったらって考えてるんじゃね?
でも、NULL と比較した方が分かり良いよ。
330 :
デフォルトの名無しさん :2008/01/29(火) 00:15:12
>>324 さん
サーティファイです
今 3級は持ってるんですけど
こんなのじゃ意味無いよなぁ
最低でも2級は取らないとなぁ..
あんなの2級も3級も大差ないだろw
うちの新人、3か月程度の研修のあと文系出身を含め全員が受験。 結果、全員が2級合格。プログラム未経験者含め数名が1級合格。 その程度の試験。あるに越したことはないが業務レベルに比べれば大したことはない。
334 :
デフォルトの名無しさん :2008/01/29(火) 00:30:17
1級かぁ.. まだまだほど遠いなぁ しょせん俺なんかカスだな
独学での勉強かつ普通の生活ってんなら無理があるだろうな、覚えられる範囲。 実用的かつ難易度高いソース書きたいなら やっぱ業務とかに携わったりとかで、一日8時間普通にソース見てないと。
ちょっと聞きたいんだがポインタ配列として*〜[]で宣言しつつ 調べる時にはポインタ変数でインクリメントって出来る? いや、基本的には出来ないってのはわかってるんだが ↑の2つが指定された課題なもんで 意図してるところが違うことなんじゃないかと思い始めて…
言っている意味が分からん。
ごめん、もう少し詳しく書く 宣言の時には char *hoge[]{ } で、 走査するときにはポインタ変数を使えって言われたんだ でも配列はインクリメントできないから、普通無理だよね? 何か方法あるのかな?ってことです
間違えた char *hoge[]={ … } で
配列はインクリメントできないが、 char *hoge[] = { ...... }; char **p = hoge; p++; というのはできる
たとえばこんな感じか?配列内の偶数だけインクリメント。 int num[] = { 1, 2, 3, -1 }; for ( int * p = num; *p != -1; p++ ) { if ( *p % 2 == 0 ) *p++; }
>>340 それやってみたんだが
それぞれの配列の先頭のアドレスがポインタ変数に格納されるから
インクリメントするたびに、配列の部分は何も変わらないみたいなんだけど…
つまり
char *hoge[] = {};
*hoge++;
と同じ
ちがうだろ。
おかしいな… もう一度チェックしてみる
>>342 言いたい事がわかった希ガス。
つまり、
char *hoge[] = { ...... };
hoge[0][0] = 1;
ということをポインタで出来るか、ということだよね?
それなら、面倒だけど、
char *hoge[] = { ...... };
char **p = hoge;
char *pp;
p++;
pp = *p;
*pp = 1;
pp++;
ということになるな。
>>345 >hoge[0][0] = 1;
>ということをポインタで出来るか、ということだよね?
そういうことです…わかりにくくてすみませんorz
>>345 そのやり方でいけました
ありがとうございましたorz
char (*ptr)[10];
>>347 かなり根本的に別のもんじゃねーかそれwww
350 :
デフォルトの名無しさん :2008/01/29(火) 11:03:22
[x][y][特定値]
>346が判っていない気がするのは気のせいだろうか。
>>300 ダブルポインタ使ってポインタ配列を動的確保したいのかな
だとすれば、xとyを仮にint型と仮定して
unsigned char **array(int x, int y)
{
unsigned char **pa;
int i;
/*ポインタ配列を動的確保*/
pa=(unsigned char**)malloc(x*sizeof(char*));
if(!pa) /*エラー処理*/
for(i=0;i<x;i++) {
/*配列要素を動的確保*/
pa[i]=(unsigned char*)malloc(y*sizeof(char));
if(!pa[i]) /*エラー処理*/
}
return pa;
}
とかの関数を作って呼び出し側から(仮にx=4, y=10としたら)
int x=4, y=10;
unsigned char **in=arrya(x,y);
で後は、普通の配列と同様に使いまわせるはず
ただ、処理が終わったらfree()しない駄目だけど
353 :
352 :2008/01/29(火) 15:05:10
>>352 訂正
>int x=4, y=10;
>unsigned char **in=arrya(x,y);
正しくは、
int x=4, y=10;
unsigned char **in=array(x,y);
です
だから、それじゃダメなんだってば
あほすぎ
>>354 >>352 で拙いか?
unsigned char **in=array(x,y);でin[x][y]となっているハズで
そのまま要素数を指定すれば配列のアドレスを指すと思うけど?
inを得るまではいい。そのあと、「普通の配列と同様に使い回せる」と思うのなら試してご覧。
そこから先で君のしたいことの何ができなくなるのかは知らんよ だいたい「普通の配列と同様に使い回せる」って何だよ
あらあら こいつ人格攻撃始めちゃったよ
そもそもの質問に「普通の配列と同様に使い回せる」なんて要件ないじゃん。
人格と能力の区別くらいつけて欲しいと思うなり。
条件の後出しなんて普段から無能な質問者と接してる君らにとって珍しい事ではなかろう
365 :
352 :2008/01/29(火) 20:19:48
>>361 >>360 は別人だけど
面倒だけど簡単な例として
(array()は
>>352 で示した通り)
nt main()
{
/*例として*/
int x=3,y=5;
unsigned char **in=array(x,y);
int i, j;
/*例として*/
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
in[i][j]=('A'+i)*(j+1);
}
}
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
printf("%c ",in[i][j]);
}
printf("\n");
}
for(i=0;i<x;i++)
free(in[i]);
free(in);
return 0;
}
>>352 及びx,yをそれぞれ指定してやればすんなり可変長の2次元配列が簡単に組める
特に行列での演算やる時は普通に使うけどな
あらあら こいつ別人のふりし始めちゃったよ
void func() { char str[100] = {0}; ・・・・・・ と void func() { char str[100]; memset(str, 0, sizeof(str)); ・・・・・・ とするのって、同じだと思って問題ない? どっちの方がいいとかあるならそれも教えて欲しい
>>367 文字列として扱うなら、全部0で埋める必要ないよ。
自称上級者で、memset()するのがいいって信じ込んでるやつとかけっこういるけど。
とりあえず質問に答えろよw
どっちも悪いってことだろ。
>>367 ついこないだ上司に質問したばっかりの内容とカブってるけど
パっとみ、宣言と同時に{0}だと、ん?って思うから
memsetなり、ループで全部0で埋め尽くすなりしたほうが、跡でソース見たときにわかりやすいらしいから
後者のほうがいいみたいよ。
どっちも配列の中身は一緒だけど。
馬鹿なコンパイラは上だと最初の要素に 0 代入してから後をゼロクリアしてた気がする。
文字列をmemset()でクリアしてるやつは素人だろ。
つーか、空文字列で初期化するなら 普通は char str[100] = ""; じゃないのか?
char配列だからって文字列とは限らんだろうが…
馬鹿ばっか
ぶっちゃけ何が正しいってのは無い
>>375 変数名 str で文字列として扱わないとか
逆にそんな命名する頭を疑うわ。
>>378 ほ、ほら、ゲーム作成過程でのStrong(力)かもしれないじゃない!!!・・・じゃない!!!
>>375 だから文字列として扱うならって前置きしてるじゃん。
それに文字列でもないのにstrって変数にしてたら、そこもちょっとおかしい。
>>377 文字列を0の全クリアで初期化するスタイルは正しくない。
\0でのクリア=0でのクリア・・・?
'\0' == 0
while(適当){ str[i] - '0' } って記述は何を意味してるんでしょうか strはchar型の配列なんですが、意味不明です
strのi番目の要素から'0'を引いてる
きっとstrの各要素の文字は数字 そしてその文字に対応する数を求めてる
str[i]の中身に文字型の数字がはいってて整数型に直してるんだろう str[i] - '0'
なるほど これ、文字から整数にするのに他に方法ありますか? 筆算するプログラムを書いてるんですが、後から0が表示されなくなるんです。
これより難しくなってもいいなら有るよ
是非お願いします
atoiとかstrtolとか
ありがとうございます。 atoi関数を使用してみます。 後者の方は引数一杯でびっくりしたので前者にしてみます。
が、速攻でエラーが出ました。 void input(char* buf) { char str[70]; int i , j ; printf("input data"); scanf("%s",str); i = strlen(str); j = 0; while(i>0){ buf[j] = atoi(str[i]); j++; i--; } return 0; } 逆順に格納してるのは意図的です。 bufは他で初期化済みです。 これは変換した値を渡すことが出来ないんでしょうか。
文字を渡すな 文字列を渡せ
な、何か変でしょうか
逆順なら文字列渡しても無理だがな
'0'を引くしかないよ
char tmp[2] = {0}; tmp[0] = str[i]; buf[j] = atoi(tmp); でもいいけど、'0'を引いたほうがいいな
あ、ようやく理解しました。 すみません。ありがとうございます。 void lineprint(char c,char* line,int digit){ int i,k; printf("%c",c); for(i = 69;i >= 0;i--){ printf("%d",line[i]); } printf("\n"); return 0; } という関数が筆算の表示部分なんですが、配列の要素が無い部分、つまり0が入ってる初期化された部分にスペースを代入してから表示しようとすると、計算結果が0になった場合、0が表示されません。 つまり0が並んでるのは見栄えが良くないのでスペースを入れて消そうと考えたのですが・・・ スペースはfor文で配列に数字が入っていない部分に代入、表示させたいのです。 引数のcは、+等の四則記号部分、lineは筆算の配列部分、digitは配列の要素数をstrlenで取得した物です。
バッファオーバーフローを起こさないためには具体的にどうすればいいですか?
サイズをチェックする。 そしてサイズをチェックできない関数を使わない。
サイズ指定の際、符号なしと符号ありの混合演算に気をつける サイズを保持または指定する整数のオーバーフローに気をつける
Cを使わない。
このスレでそれは無いだろう。 どうすればバッファオーバーフローが起こらないことを保証できるか考えてコーディングする。
#include<stdio.h> int main(void){ int year, month, day, week, tmpm, tmpy, i; int daymax[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; year = tmpy = 2008; month = tmpm = 1; day = 1; if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) daymax[1] = 29; if (tmpm < 3) { tmpy--; tmpm += 12; } week = (tmpy + tmpy/4 - tmpy/100 + tmpy/400 + (13*tmpm+8)/5 + day) % 7; for(; month <= 12; day++, week++){ if(week == 7) week = 0; if(day == 1){ printf("\n***** %04d / %2d *****\n", year, month); for(i=0; i < week; i++) printf(" "); } printf(" %2d", day); if(day == daymax[month-1]){ putchar('\n'); day = 0; month += 1; continue; } if(week == 6) putchar('\n'); } return 0; } カレンダー作成で何度か修正を試みたのですがエラーがでてしまいます、 どこがおかしいのでしょうか?
※どんなエラーが出るのか書きましょう
void foo(size_t n) { size_t buf_size = sizeof(int)*n; int* p = malloc(buf_size); memset(p, 0, buf_size); } 以前こんなコードを見かけたけど、 size_t=32bit sizeof(int)=4 の場合 foo(0x40000000U); とかやっちゃうとおかしな事になるね こういうのもオーバーフローの遠因になったりする
409 :
デフォルトの名無しさん :2008/01/30(水) 00:18:11
お聞きしたい事があるのですが、 配列から指定の要素を削除するのに、 ソートかけて、二分検索かけて、見つかった箇所から、 一個づつ添字ずらすより早くやる方法ありますでしょうか?
>>409 ビンソート(バケットソート)
ハッシュ
・その配列がソートされている必要があるのか ・その配列は先頭から末尾の要素が連続している必要があるのか
バイナリサーチするならソートするだろ
ソートされてなくてもいいなら、バイナリサーチより削除を速くする方法はあるってこと。 ソート状態を保たなきゃいけない場合は、ハッシュとか使えないでしょ。
苦しんで以外で 初心者向けな説明が書かれているサイトありますか?
C言語でググった一番上。 基礎はあそこで十分だろ
Wikipediaってなんでも載ってるな
いまさらw
クラッキングから今晩のオカズまでなんでもあるんだぜ?! でもcの基礎的な部分はUNIX系のmanpageが便利だと思う
ちょっとまて、ソートして二分探索するより 線形探索のが早いだろw
420 :
デフォルトの名無しさん :2008/01/30(水) 05:58:35
以下のソースコードは、プログラムの一部である。その実行結果を示せ。 int i,j; int*ptr=&i; printf("ptr==&i → %d\n",ptr==&i); printf("ptr==&j → %d\n",ptr==&j); これ頼む!後数時間後でC言語の試験があるんだ!卒業がかかってるにもかかわらずやる気なくてごめんなさい、後でいくらでもあやまるから教えてくださいっ!
422 :
デフォルトの名無しさん :2008/01/30(水) 06:22:36
なにがわからないかわからないくらいダメダメなんだけど過去問がそのまま出るから答えさえわかれば暗記してなんとかなるんだ
ptr==&i → 1 ptr==&j → 0
425 :
デフォルトの名無しさん :2008/01/30(水) 06:28:16
ありがとう、全力で感謝する
これ、何を問う問題なんだろうな
問題を読めばわかるよ
>>407 c:\documents and settings\my documents\visual studio 2005\projects\karennda7\karennda7.cpp(4) : error C3872: '0x3000': この文字を識別子で使用することはできません
[この文字を識別子で使用することはできません]が大量に出てしまいます。
>>428 空白に全角がいるんじゃねーの?
コピペしたコードによくある。
431 :
デフォルトの名無しさん :2008/01/30(水) 17:36:29
・0〜99の100個の数字から異なる30個を選び、配列COM[30]に 格納せよ。 ・次に異なる6個の数字を入力し、順番に配列MAN[6]に格納せよ。 ・ソート方法Aを用いて配列COM、MANの要素をそれぞれ小さい順に並べよ。 ・配列COMに含まれる配列MANの数字の個数countを求めよ。 ・最後に、配列COM、MANの全要素、変数countを result.outに書き込め。 ・出力形式は自由とするが、main関数内は10行以内にすること。 [ソート方法A] ・作業用の配列として、要素が100個のint型の配列Workを用意する。 ・配列Workの各要素は、0に初期化する。 ・ソートしたい配列xの要素を順番に読んで、Work[その値]を+1する。 ・作業3をすべてのxの要素について行った後、Workの要素を小さい方から順番に よんで、Workの値が0でなければ、xに書き戻します。 という課題が出たんですが、全然できないので、誰か助けて下さい
宿題なら、それ用のスレがある。
そういうやつこそ基礎が出来なくて後で泣くことになる
435 :
デフォルトの名無しさん :2008/01/30(水) 21:58:54
Borland C++ Compiler 5.5 に登録して、しかもパスワード(二種類)入力して 解凍もしたのに、まだコンパイラが起動できない。どうしたらいいか教えてくださいです。
というかスレ違い
438 :
デフォルトの名無しさん :2008/01/30(水) 22:23:14
>436 ありがとう。
ソース無けりゃエスパー待ち
>>439 a.exa とかタイプしたんじゃねーの?
きっとエラーメッセージは command not found だべ。
げ、h抜き忘れました。申し訳ない。 どうかよろしくお願いします。
>>442 というかアイコンをダブルクリックして実行してますのでそれはないです。
一応コマンドプロンプトからそれを確認しつつ実行しましたがダメでした。
char table[]; /* table:実際に記録しときたいデータ */
447 :
デフォルトの名無しさん :2008/01/30(水) 22:52:37
初投稿です。 あの、c言語使うときのお勧めのテキストエディタってなんですか? フリーでお願いします・・・ 総合環境はいらないです・・・・
>>445 大きさ指定したら実行できました!でも無限ループするようになってしまいました。
ちょっと急用ができたため後で自力で直そうと思います。
ありがとうございました。
450 :
デフォルトの名無しさん :2008/01/30(水) 22:55:49
>>447 emacs サクラエディタ 秀丸エディタ
emacsはキーバインドに慣れたら快適
サクラに一票かなぁ。 それかvim
CPadが便利だがあれは統合環境になるのかな?
↓ copy con foo.c の登場
vim 中毒
ウインドウを表示させて、その中に入力できる場所を作りたいのですが どうすれば出来ますか
環境も言わずに
>>457 まずVRAMとかフレームバッファとか言われているメモリへのアクセス方法をぐぐってみるのはどうだろうか?
自前でコントロール描画っすか
scanfで入力待ちしている所に、別スレッドから入力させれないだろうか? void func1() { char buff[16]; scanf_s("%s", buff, sizeof(buff)); // ←こいつを } // func1とは別スレッドで実行 void func_2() { // ここから終了させたい }
stdinを閉じてみるとか
WinならSendMessageで無理やり出来るかもな
「8名分の氏名、学籍番号、身長の入力を構造体の配列を利用して行い、それらのデータをクイックソートし 身長の低い順に氏名、学籍番号、身長を画面に出力するプログラムを作成せよ」という問題がでました。 まず、クイックソートのプログラムとしては #include <stdio.h> void quick_sort(int sort_data[], int start_index, int end_index ) { int ascending_index = start_index; int descending_index = end_index; int temp_data; int pivot_value = sort_data[start_index + (end_index - start_index )/2 ]; printf("quicksort %d - %d ",start_index,end_index); printf("pivot_value %d\n",pivot_value); do{ while (sort_data[ascending_index] < pivot_value) ascending_index++; while (sort_data[descending_index] > pivot_value) descending_index--; if (ascending_index > descending_index) break; temp_data = sort_data[ascending_index]; sort_data[ascending_index] = sort_data[descending_index]; sort_data[descending_index] = temp_data; } while ( ++ascending_index <= --descending_index ); if (descending_index > start_index ) quick_sort(sort_data, start_index, descending_index ); if(ascending_index < end_index) quick_sort(sort_data, ascending_index, end_index ); return; } という感じになりました。
すみません、
>>464 の続きです。次に、構造体の利用の方が、
#include <stdio.h>
#define NAME_MAX 20
struct student_data{
int number ;
char name[NAME_MAX+1];
double height;
};
int main (void)
{
#define STUDENT_DATA_MAX 5
struct student_data input_data[STUDENT_DATA_MAX];
struct student_data * data_p;
int input_count;
for (input_count=0; input_count < STUDENT_DATA_MAX; input_count +=1){
printf("Student number->");
scanf("%d",&input_data[input_count].number);
printf("Name->");
scanf("%s",input_data[input_count].name);
printf("Height->");
scanf("%lf",&input_data[input_count].height);
}
for (input_count=0,data_p = input_data;
input_count < STUDENT_DATA_MAX;
input_count +=1, data_p ++){
printf("%d ",data_p->number);
printf("%s ",data_p->name);
printf("%lf\n ",data_p->height);
}
return 0;
}
までは自分でやってみたのですが、この2つを組み合わせる方法が分りません。どなたか教えていただけませんか?
関数プロトタイプ書いて、main から呼べばいい
void quick_sort(int sort_data[], int start_index, int end_index ) { : } int main (void) { : } の順に並べればよろし
void型の関数って最後returnしたほうがいいの?
返すものが無いからvoidなのでは?
文法上はする必要は無い。 ここで処理を終了しますって意味で明示的にreturn;するのはあり。
return void; は C++から出来るんだっけ
できないだろ できたらテンプレート周りが楽になりそうだけど
void foo() { } void bar() { return foo(); } は gcc だと警告吐かれた。 もちろん g++ だと大丈夫だった。
>>472 VC6 あたりはできないけど、規格上大丈夫になってるよ。
多分、そのテンプレート周りを考慮しての決定なんだろうと思ってる。
Java厨です。 POSIX環境でのマルチスレッドプログラムについて教えてください。 POSIXスレッドを使ったマルチスレッドプログラムで、 特定のスレッドのみ指定時間Sleepさせる方法はありますか?
普通に別スレッドでsleep使ったら的な
ファイルの読み取りで 12 34 56 34 56 78 … みたいなのはfscanf(fp,"%d %d %d\n",x,y,z); でいけるのはわかったのですが 12,34,56, 67,89,10, … みたいなのは、どうやって読み込むのでしょうか また、ファイルによってスペースだったりカンマだったり 列が3列だったり5列だったり…とあって どうやって条件分岐させていくのか検討がつきません
1行ずつ読んで、自分で解析すれば。
480 :
デフォルトの名無しさん :2008/02/02(土) 15:50:11
すみません、教えてください。 printf("古いファイル名を入力\n"); gets(oldname); printf("名前1を入力\n"); gets(nam1); printf("名前2を入力\n"); gets(nam2); sprintf(newname,"%s%s\n",nam1,nam2); if (rename(oldname,newname) == 0; printf("%sを%sに変更しました\n",oldname,newname); こんな感じでsprintfで格納した変数でリネームしたいのですが 上手くいきませんでした。良い方法ありましたら教えてください神様。
>if (rename(oldname,newname) == 0; なにこれ
>>477 fscanf(fp,"%d,%d,%d\n",x,y,z);
>>479 fgetsして、strspn等str*系関数を使う。
strspnの動きがよく分からない
この場合strcspnが適当かも知れんな。
>>481 すみません、タイプミスでした。
if (rename(oldname,newname) == 0);
>>483 なるほど!アドバイスありがとうございます!
>if (rename(oldname,newname) == 0); なにこれ
同じ人だったのか
489 :
デフォルトの名無しさん :2008/02/02(土) 17:53:31
>>487 すみません、タイプミスでした。
if (rename(oldname,newname) == '\0');
つりですか^^^;
>if (rename(oldname,newname) == '\0'); なにこれ -> '\0'
printfなどの関数の中身が見たいのですが、stdio.hを開いても中身らしき部分がありませんでした。 どこで見ることができるのでしょうか?
www.gnu.org
C:\Program Files\Microsoft Visual Studio 8\VC\crt\src
>>493 stdio.hにあるのは関数を使えるようにするための宣言だけ。
関数の実装はリンカがリンク時にくっつけるライブラリファイルの中にある。
コンパイラによってはソースが公開されてたりもする。
>>492 すみません、タイプミスでした。
if (rename(oldname,newname) != EOF);
>if (rename(oldname,newname) != EOF); なにこれ
スレ違い失礼します。
雑談スレに書いたのですがレスがもらえなかったので
良かったら評価のほうしていただけますか?
http://toku.xdisc.net/cgi/up2/frew.html のxs5050のファイル
友人の組んだC言語のプログラムなのですが本職の人から見たら
どの程度なのでしょう?
(プログラマーとして就職できる、中学生レベル等)
友人は2ちゃん嫌いのため代理しました。許可は取ってます。
ウイルスなどはありません。
よろしくお願いします
説明
====================
Zバッファ法でつくりました。
ポリゴンと視線の交点の座標をテクスチャ座標に
変換して。テクスチャマッピングしてます。
C言語で組みました。
DDraw,D3Dは使っていません。
====================
C言語スレだから、ソースじゃないとなんとも言えない。
動けばいいってもんじゃないぜ。 書き方や考え方知るにもソースないんじゃ何も言いようが無い
> (プログラマーとして就職できる、中学生レベル等) コードを書く力ってことなら、趣味の学生に負けてる職業プログラマっていっぱいいるしなぁ。 っていうか、趣味っていえるくらいプログラミングに時間をつかってて、それを数年も続けているなら、 職業プログラマの上位30〜50%以上には入ってるんじゃないの?
俺の事か
504 :
499 :2008/02/02(土) 23:16:52
>>500-502 レスありがとうございます。連絡とってソースうpします。
スレ汚しすいません。
ここで判定してもらって何になるのかなぁ。
506 :
デフォルトの名無しさん :2008/02/02(土) 23:25:15
callocでchar分を256個確保し、文字列を入れた後で reallocでchar分を512個分にし、文字列を追加したいんですが、 どうすればできますかね?
>>506 ふつーstrcat() だけど、そういう意味じゃなくて?
>>504 あまり大き過ぎても答えられないかもしれないし、ほどほどに
>>506 char* p = (char*)calloc(256,sizeof(char));
(文字列を入れる処理)
p = (char*)realloc((void*)p,512);
(文字列を追加する処理)
レスありがとうございます。 callocとreallocはそれぞれ別々のポインタを使って処理したいんですが、どうすればいいですかね?
実体も別々なのか? なら、realloc意味なくね?
>>511 reallocに渡すポインタとリターン値を受けるポインタを別々にしたいってことかもよ。
追加された部分の先頭ポインタが欲しいって意味なのかなと思ってみた
char* pc = (char*)calloc(256,sizeof(char)); (文字列を入れる処理) char *pr = ((char*)realloc((void*)pc,512))+256; (文字列を追加する処理) free((void*)pc);
char *buf = (char *)calloc(256,sizeof(char)); if(buf == NULL) { puts("確保失敗") }else{ buf = "文字列"; char *tmp = (char *)realloc(buf,512); if(tmp == NULL) { puts("領域の変更に失敗") }else{ buf = tmp; 文字列追加処理 } } free(buf); return 0; }
>>515 > buf = "文字列";
この行は
strcpy(buf, "文字列");
だよ。
> 文字列追加処理 ここは、 strcat(buf, "追加文字列"); だよ。
ありがとうございます!!!!!!!
520 :
499 :2008/02/03(日) 02:25:54
まず思ったのが他人が読む事をあまり考えてないようだという事 コメントが少なすぎて解読に手間が掛かる
関数でかすぎ
ニートは時間有り余ってるからから関数でかくてもいいんだよ!
>>520 就職できるかどうかっていう観点でレスすると
プログラムの書き方はかなり問題があるがこれだけできるなら
本人さえやる気出せば就職できるところは見つかるだろう(年齢によるけど
中小の会社なら実力は未経験に近くても人柄が気に入られればとってくれるところは多いぞ
525 :
499 :2008/02/03(日) 02:44:45
>>521-523 専門用語は私には、よく分からないのでコピペして
伝えておきます。
ありがとうございます。
>>524 そうですか。友人は口は達者なんですけど
一応、やればできるってことですね。
ありがとうございました。
もっと関数を使って変数名をわかりやすくすれば仕事できるんじゃないかな? このtxt分で何時間かかったかにもよるけど。
>>525 一応補足しておくと就職試験やらで520のソースを出されたらさすがに取ってくれる会社はほぼないと思います。
仕事にしたいなら他の人もいってるように関数分けるとかソースわけるとかコメント増やすとか
プログラムの書き方もう少しきちんとしたほうがいいです。
要はやる気出して勉強すれば就職するだけなら無理ではないよってことで。
どういう仕事につきたいのか知らないけど、 新卒じゃないならC++くらい扱えたほうがいいなぁ
人の目を見て会話できれば25歳位までなら未経験でも雇われる
>>497 rename() が失敗したときは非零の値を返すのだから(K&R2)
if (rename(oldname, newname) == 0)
でいいと思います。
それから、これは明らかに「タイプミス」ではないですよ。用語に注意。
>>520 まだまだ…(中略)…まだまだ改善の余地がある
1.コピペしすぎ
2.グローバル変数多すぎ
3.命名規則が不明
4.即値使いすぎ
5.構造体にメンバ多すぎ
と知ったかぶってレスしてみる
Cプログラミング診断室にとてもありそうなコードだなw
>>498 すみません、タイプミスでした。
#include<stdio.h>
int main(void)
{
printf("古いファイル名を入力\n");
gets(oldname);
printf("名前1を入力\n");
gets(nam1);
printf("名前2を入力\n");
gets(nam2);
sprintf(newname,"%s%s\n",nam1,nam2);
while (rename(oldname,newname) != 0)
{
printf("%sを%sに変更しました\n",oldname,newname);
}
return 0;
}
お前等インデントぐらい入れようよ 見づらいよ
537 :
デフォルトの名無しさん :2008/02/03(日) 10:38:27
複数の引数を持つ関数形式マクロを定義して、 さらにその複数の引数の組もマクロで定義したいんですが、上手く出来ません。 例えば次のようなコードです。 #include <stdio.h> #define KAKE(X,Y) (X*Y) #define TWO_ARGS "4,5" void main() { int ret; ret = KAKE(4,5); // これはエラーとならない ret = KAKE(TWO_ARGS); // コンパイルエラー printf("%d\n", ret); // 20と表示される事を期待している }
538 :
537 :2008/02/03(日) 10:39:00
自分の環境では、コンパイルエラーのメッセージは 「マクロ 'KAKE' に指定された実引数の数が少なすぎます。」 と出ています。 エラーが発生している文『ret = KAKE(TWO_ARGS);』が マクロにより『ret = KAKE(4,5);』と展開される事を期待したのですが 『4,5』が一つの文字列リテラルとして扱われているような気がします。 ちなみに 『#define TWO_ARGS "4,5"』の行を 『#define TWO_ARGS (4,5)』としても 『#define TWO_ARGS 4,5』としても上手くいきませんでした。 何か良い方法はないでしょうか?
#define KAKE_TWO_ARGS KAKE(4, 5) でいいと思うが
一応これで通りはする。 #include <stdio.h> #define KAKE(x, y) ((x)*(y)) #define KAKE_(x) KAKE(x) #define TWO_ARGS 4, 5 int main() { int ret; ret = KAKE(4, 5); ret = KAKE_(TWO_ARGS); printf("%d\n", ret); return 0; }
>>540 537じゃないけど、コンパイラ教えて。
VC2005だと通らない
gcc
-ansi -pedantic -Wall で通るから 規格違反ではないと思う。多分。
>>536 勝手にインデントが消えちゃうんだよ。
インデントを残す方法を教えてケロ
無理。 スペースで代用するしかない
>>536 専ブラ入れてポップアップさせれば
専ブラによってはインデントされて見える。
例えば俺の使ってる V2C は、
レス番号を打ち込むか、レス番号に相当する数値を選択してクリックすると、
レスアンカーがなくてもポップアップしてくれる。
全角スペースか 使えば ブラウザ上でインデントを付ける事は可能。
インデント付いたかな  あ あ
セミコロンつけろや
よし、もういちど こっちはあんどえぬびいせぴいせみころん こっちは全角スペース
non-breaking space の略な。 基本的には半角スペースが表示されるが、 専ブラでコピペすると nbsp が保存されることがある罠。
別にインデント腐ってもコンパイルとおるからどうでもいいだろう Pythonじゃあるまいし
>別にインデント腐ってもコンパイルとおるからどうでもいいだろう こういう事平気で言えるの人の書くプログラムは読みたくないな
よーく考えよう。インデントは大事だよ。 インデントは計画的に。
まともなエディタならキー操作一つでフォーマットできるだろ
わざわざスペース置き換えたりしてまでインデントにこだわりたくないな 2chなんだし見やすくしたい人はやるし、どーでもいい人は別にそのままでいいと思う
教えてやる側はともかく、教えてもらう側はインデントありで貼り付けたほうが、答えがもらえる可能性がたかくなるな。
置換が面倒だから全角スペースは微妙だな。
ソースをそのままうpろだにあげるのが一番いい気がする。
それはわざわざ見に行くのがめんどい
562 :
499 :2008/02/03(日) 18:03:05
>>526-530 532-534
まとめてですいませんが
ありがとう御座いました。m(_ _)m
まとめるな 失礼な奴だ
専ブラによっては1クリックで開く。専ブラとIEとを平行してみれるから楽です。宿題を解くときなんかは。
565 :
デフォルトの名無しさん :2008/02/03(日) 20:23:21
文字数を求めるのに、 for文を使い、\0まで達するまでiをインクリメントし数えるのと、 strlenを使うのとでは、どちらのほうが早いですか?
strlenを使うほうが、プログラム作成は早い。
strlenでいいだろ。 CPUにあわせて最適化してあるかもしれないし
strlen()のソースでも眺めてみたらいいんじゃないかと。
早いかどうかだと strlen を使った方が早い。 速いかどうかだと実測あるのみ。
ここでそんなこと訊いてるレベルなら、strlen()使っとけ。
同じ文字列の長さを調べるってのを何度もループさせてかかる時間調べたらいいよ。
コンパイル時パラメータを-Wにするとどうなるんだ? APIの時に、やれって言われたんだが。 意味が分からん。他の種類とかも教えてケロ
ランタイムライブラリなんかいろいろ凝った作りしてるよね。 memcpyなんかわざわざロングでコピーして端数を調整したりとか
>>573 のってなかったお。簡単な説明しかみつからないお。
>>575 コンパイラの名前を書かないとわからんよ。
警告のレベルだと思うけど。
>>576 cpad for borland c++compiler
cpadはコンパイラじゃn(ry
>>578 Borland C++ Compilerですか?
580 :
499 :2008/02/03(日) 22:00:23
>>563 すいません。長いプログラム読んでいただいたのに
失礼でした。すべてにレスしたいのですが
私がすると、とんちんかんなレスになってしまいそうなので…( ゜_゜;)
友人にはコピペして送ります。
すいませんでした。
スレ違い失礼しました。
BCCの-WならWin32のGUIアプリ作成だろ。 起動時にDOS窓が出なくなる。 てかコンパイラのリファレンスに載ってねぇわけないじゃん。 見てるの間違えてるか、見方分かんないか、見て無いか、どれかじゃね?
>>581 見てないだな。
cpadの説明書睨んでたんだぜ
583 :
sage :2008/02/03(日) 22:52:27
584 :
デフォルトの名無しさん :2008/02/04(月) 22:12:44
C言語初心者です。voidポインタ関連で質問です。 以下プログラムの抜粋です。 m_sort(void* base,int n_elem,int size,int(*empare)(void*,void*)) { void *x,*w; x=base+(n_elem-1)/2; ここでbase+(n_elem-1)/2はvoidポインタなのでxに代入すると エラーが出てしまうのですが、関数の引数の size=sizeof(int,char等) と設定し、このsizeを使ってなんとか解決できませんか? よろしくお願いします。
baseをchar*にキャスト
586 :
584 :2008/02/04(月) 22:22:44
baseをintポインタにも対応させたいのですが、 無理でしょうか?
>>586 要するに qsort みたいな関数を作りたいということ?
588 :
584 :2008/02/04(月) 22:27:31
>>587 その通りで、汎用関数を作りたいのです。
>>588 >>585 のいう通りにすればおk
x=(char*)base+(n_elem-1)/2*size;
590 :
584 :2008/02/04(月) 22:50:15
>>589 え・・・と・・・
sizeを掛けるとその型になるんですか?
x=(char*)base+(n_elem-1)/2*size;
ってたぶん
x=(char*)base+((n_elem-1)/2)*size;
ですよね?
(n_elem >= 2 && size > 0) x = (char *)base + size * (n_elem - 1);
592 :
584 :2008/02/04(月) 22:58:05
>>591 やっと意味が分かりました・・・
charポインタ扱いにして、サイズ分だけずらしていけばいいんですね!
どうもありがとうございました・・・
>>593 空白には全角スペース、半角スペースがある。
一般的にコンパイラは全角文字を受け付けない。もちろんリテラルは別。
エディタの設定等で全角スペースに色をつけることもできる。
全置換で全角スペースを半角スペースに変換するのでもいい。
595 :
デフォルトの名無しさん :2008/02/05(火) 09:25:56
C言語2級受けた人いますかね? 問題・解答等を教えて欲しいのですが? いないかぁ..
過去問なら本屋に買いに行けば?売ってるかどうか知らんけど
int num[256]; みたいな配列を同じ数字(例えば0)で初期化したいのですが、 for(i=0;i<256;i++) { num[i]=0; } みたいに一個づつ入れるしかないでしょうか?
>>597 配列宣言時なら、
int num[256] = {0,}で0にはできる。
そうでないなら、地道に入れるしかないんじゃないかな。
# 勿論、C++のstd::fill()のような関数に仕立てておくのはあり。
ありがとうございます。 その形でいくつか試してみたところ、例えば int num[256] = {1,}; だと一個目の要素だけが1になって、残りは全部0になったのですが、これは、 「初期化すると、{}内で個数が足りてない要素は全部0で初期化される」 という解釈で良いのでしょうか?
>>599 いいよ。
そういう時は、アセンブラで出力してみることと規格を探してみることの両方やるといい。
ありがとうございました。 はじめたばかりで今のところアセンブラとかさっぱりですが、心の隅にとどめておきます。
602 :
598 :2008/02/05(火) 14:47:23
だから、「0にはできる」と書いたのにw 0以外にもいろいろ使う積もりなら、こんな関数でも作っておいたら? void fillInt(int * foo, unsigned size, int val) {for (unsigned ic = 0; ic < size; ++ic) foo[ic] = val;}
連続した領域に同じデータ、ならばmemsetもつかえる。
バイトに限るけどね
605 :
313 :2008/02/05(火) 18:17:03
C言語を勉強しようか迷ってます。 C言語で何をするかが、分りません。 皆さんは、C言語で何をしてるんですか?
これはひどい。
608 :
605 :2008/02/05(火) 18:34:02
学校ではjavaを勉強してます。 冬休みで、暇なのでとりあえず違う言語の勉強をしようと思ってます。 いろいろ調べて、「C言語は基本」っていろんなホームページで書いてありました。 でも、C言語はGUIのアプリケーションを作れないし、ネット環境でも使わないと書いてありました。
609 :
605 :2008/02/05(火) 18:34:57
Cげんごでなにをすればいいのかわかりませn
別に無理にやらなくてもいいよ。
入門書にはほとんどのプログラムはCで出来ているって書いてたよ
612 :
デフォルトの名無しさん :2008/02/05(火) 19:45:40
ベクターのフリーソフトで オススメのコンパイラないですか?
>>613 使いなれてる?サイトだからです。
だから
なるべくベクターでお願いします
コンパイラと統合環境、エディタ混同してると見た
そもそもベクターにコンパイラってあんの?
LSI C-86 v3.30c 試食版程度なあるがオススメはしない。 そもそも、そんな甘えを言ってる時点で プログラムなんてできるわけがない。
#include <stdio.h> main () { char *s; scanf("%s",s); return0; } 上記のようなプログラムを作成し、実行しました。 すると、 入力が「111111111111111」のときは正常終了したのですが、 入力が「1111111111111111111111111111」のときはセグメント例外がおきてしまいました。 ここで質問です。なぜ二度目の実行でセグメント例外が起きてしまったのでしょうか? 自分は、「ポインタ宣言時に確保したメモリの範囲外に書き込もうとしため」と考えたのですが、そもそも一度目の実行で1byte(char一個分)以上の入力ができてしまっていますよね。この時点で、理由がわかりません。 よろしくお願いします。
>>618 char *s;
に1byteだろうが突っ込むこと自体が間違い
短いときうまくいったのはたまたま指している先が書き込めるとこだったというだけ
>>618 正常終了したのはたまたま運が良かっただけ。
そのプログラムには文字列を格納する領域が1bitたりとも確保されていない。
gccを使っているのですが判らない点があるので教えて下さい。 ヘッダーファイルに書いている#defineの値をコンパイル時のオプションで 変更できると聞いたのですがどう指定すればいいのでしょうか?
>>608 Cは基本だなんてとんでもない。
プロが使う、使い方を間違えると大怪我をする、切れ味の鋭い包丁みたいなもんだ。
食事用のナイフならpythonとかjavaとかVBとかをどうぞ。
お前はそうなんだろうな
fopenでファイルを作成したいのですが、作成したファイルの 改行コードがCF+LFになってしまいます。改行コードをLF にすることは可能でしょうか。 ちなみにファイルに情報を書き込む際の 改行コードは'\n'を使用しています。
つうかモードの違いはそこ位しかないだろ
>>627 念のためにいっとくけど改行コードの扱い方が変わるからな
(そんな変わらんけど。単に'\n’だと思ってればよかったあの頃とは違うだけで)
ただ開き方かえるだけじゃないからな
ってことは作成したファイルも読み込む時も気をつけないといけませんね。 "br"でfopenするのは当然なんでしょうけど。 どうもありがとうございました。
631 :
デフォルトの名無しさん :2008/02/06(水) 00:05:59
すいません、お聞きしたいのですが *p++ = a * b; この計算式は どういう順序になるのでしょうか? a×bの値がpに入り pのアドレスが++ ?
そのとおり
>>630 まぁ、"r"で入力しておいて"wb"で出力ってのもありだけどね。
634 :
デフォルトの名無しさん :2008/02/06(水) 01:36:04
>>631 それであってるのかぁ..
あと
(*p)++;
は pの値が++されるだけですか?
いいえ、*pがインクリメントされます。
>>624 いや、だれだってそうだろう。Cが簡単とか基本とか誰がデマながしとんのや?
基本かどうかは知らんが簡単なのは間違いないだろ。 決してお手軽ではないけどね。
大間違いだよアホ
いくらここが入門者向けだからって、「Cが簡単じゃない」なんて戯言誰が真に受けると思うんだ? まるで、「英語は簡単じゃない」って言うようなもんだぞ。
決め付けちゃって(・∀・)クスクス
ガキを相手に大人気ない
Cは間口は広いだろうな。 とりあえずはじめるのに参考になるサイトは山ほどあるから。
644 :
デフォルトの名無しさん :2008/02/06(水) 08:50:58
>>635 さん
アドレスが++されるんでしょうか?
>>644 *pがアドレスならば、そうなります。
つまり、インクリメントされるのはpではありません。
ファイル(dp2.txt)の内容----- maximize 14 plum 4 4500 apple 5 5700 orange 2 2250 strawberry 1 1100 melon 6 6700 ------------------------ fscanf(fp,"%s%d",i,j); while(fscanf(fp,"%s%d%d",x[i].name,&(x[i].size),&(x[i].price)) ==3) i++; dp2.txtというファイルの中身を読みだして、引数に代入したいのですが 上のプログラムの場合、2回目のfscanfで読みだすのはplumからでしょうか?それともファイルの始めにもどってしまうのでしょうか? よろしくお願いします。
fpの位置は読み込んだ分だけ進みます。
>>646 plumから
実際に試せばわかりそうなものだが
ちょっと質問です・・・。 今ソケットの勉強をしてるんですが同期非同期について小学生でもわかるような説明を誰かしてくれませんか? ちょっとしたチャットアプリを作成しようと思ってるんです。 調べた結果、 同期:送信側と受信側が同じ時間をすごす=同期がとれてるといった言葉のとおり。 非同期:送信側は受信側の都合を考えずにデータを投げる、受信側はどんな状態だろうがそれを受け取り処理をして、できあがったら応答する。 だと思うんですけど、いまいち自分で何を言っているかわかってないんです('A`) もっと分りやすく相手にも伝えられるようにするにはなんていえばいいんでしょうか・・・。
スレちがい
スマソ。いつもここ開いててプログラム関連の話だとばかり思ってたらソース一行もないね漏れ・・・。
ちょっと詰まってしまったんですが、教えていただけませんか… 第6回 万年カレンダー(2) キーボードから年と月を入力し、その月のカレンダーを表示する。 47 :ha:2008/02/06(水) 22:01:47 #include <stdio.h> int is_bissextile(int year) { /* 閏年かどうか判定する関数 閏年なら1,そうでなければ0を返す */ int bis; if((year % 400) == 0 || ((year % 4) == 0 && (year % 100) != 0)){ bis = 1; } else { bis = 0; } 土曜日の場合は,既に入っているので入れない */ if((first_dow + i)%7!=1) printf("\n"); }
>>652 丸投げじゃねーかwwww
宿題スレいけw
/* 下のような書き方も可能 bis = ( year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)); */ return bis; } main() { /* 2008年2月のカレンダーを表示する 2月1日が金曜日であることがわかっているものとする (課題では,前回のプログラムを使って1日の曜日を計算する) */ int year = 2008; int month = 2; int first_dow = 5; /* 1日は金曜日 */ int i; int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if(is_bissextile(year)) { /* 閏年なら,2月を29日までにする */ days[1] = 29; } printf(" %d年%2d月\n", year, month); printf("日 月 火 水 木 金 土\n");
>>653 すいませんwww行ってきますwwwwww
656 :
618 :2008/02/06(水) 22:21:41
658 :
デフォルトの名無しさん :2008/02/06(水) 22:54:20
二つ質問なのですが、 一つ目は、fgetsとgets関数の違いは簡単に言えば、文字数が指定できるか否かでしょうか? 二つ目は、もしfgets関数で最後NULL文字を考慮しないと、どうなるのでしょうか?
>>658 改行文字の扱いが違う
null文字を考慮しないって?char配列より大きい文字列突っ込ませようとするってこと?
はみ出した先が書き込めたりしてうまく動くこともあるけどやっちゃだめ
>>658 違いは、使っていいものと絶対使っちゃダメなもの。
662 :
658 :2008/02/06(水) 23:40:22
皆さん、ありがとうございます
>>659-
>>660 >>改行文字の扱いが違う
>>違いは、使っていいものと絶対使っちゃダメなもの。
とは・・・・?考えてもピントきませんです。。。
>>661 はい、何だか難しいですが、要するにバッファオーバーフローですね。
>>662 入力の最後のenter押して終わったときにその改行文字が格納されるかどうかです
664 :
658 :2008/02/06(水) 23:44:33
>>663 サンクスです、ってきり文字数が指定できるか、どうかだと思っていました。
>>>>違いは、使っていいものと絶対使っちゃダメなもの。
>>とは・・・・?考えてもピントきませんです。。
>>661 getsを例にした入門書やサンプルがあるかも知れないけど、gets使う癖がつくこと自体が危険なので使わないこと。
scanf( "%255s" ,str ); とかだとオーバーフロー防げるとかどこかのサイトで見たけど大丈夫なん?
>>666 char str[256]に対してなら大丈夫です。
でも %s と fgets の挙動はちゃうでよ
んなるほど。 defineで例えばMAX 255にして char str[MAX]だとした場合 scanf( "%MAXs" ,str ); はもちろん駄目だよね・・・となると汎用性が狭まるなぁ
なんでやねん "%255s"という文字列を作ればいいだけじゃないか
scanf系は使うなって言う人が意外に少ないな。 仕様があいまいだし危険だから使わない方がいいんだが。 自前でカンマやタブで分割してatoiとかatofとかで読むことをお勧めする。
文字列化演算子 # を使え
>>669 こんな感じでできなくはない。
#include <stdio.h>
#define S(x) # x
#define SS(x) S(x)
#define STR_LEN 255
void func()
{
char str[STR_LEN + 1];
scanf("%" SS(STR_LEN) "s", str);
}
でも、余り使い勝手はよくないのでfgets()を使えば?
%s と fgets の挙動はちゃうでよ
そんな話かよ
小規模プログラムなら1バイト程度問題ないだろうが業務レベルとなると それがバグとなると探すのが死ねる
680 :
658 :2008/02/07(木) 00:47:52
ひ〜わけわかめです、初心者なのでついていけんです。 サンクスでした。。。
682 :
デフォルトの名無しさん :2008/02/07(木) 01:34:27
質問がありますので、ご返答戴ければ幸いです。 Void bofw(const char *str2){ char str2[80]; strcat(str1, str2); } これは、 char str2[80]にstr1, str2を合体させたものを 入れると解釈して良いでしょうか? もう一つは Void bofw(const char *str2){ char str1[80]; strncat(str1, str2, sizeof(str1) -strlen(str1) -1) これの、"-strlen(str1) -1"が理解できません、 特にsizeof(str1)から-strlen(str1)の部分です どうして"-"引くのでしょうか?
683 :
デフォルトの名無しさん :2008/02/07(木) 01:52:10
二つ目の質問に関して自分の解釈では char str1[80]に合体して入れる際に、 sizeof(str1)で文字列がstr1分で、文字数がstr1-1分少ないと言う 感じで宜しいでしょうか?
>>682 strcat(str1, str2) はstr1のうしろにstr2をくっつけたものをstr1にいれる
二つ目のstrlen(str1) + 1 は(str1にある文字列の長さ) + (ヌル文字)を表わしてて、
sizeof(str1)から引くことで、まだ使用されてない配列サイズを計算してるんだろう。
どちらのコードも少しおかしい気はするが。。。
(str2が二つあったり、初期化してなかったり)
685 :
デフォルトの名無しさん :2008/02/07(木) 02:23:44
>>684 レス、ありがとうございます。
>>strcat(str1, str2) はstr1のうしろにstr2をくっつけたものをstr1にいれる
どうして、"char str2[80]; "としてあるのに、str1にいれるのでしょうか?
>>二つ目のstrlen(str1) + 1 は(str1にある文字列の長さ) + (ヌル文字)を表わしてて、
sizeof(str1)から引くことで、まだ使用されてない配列サイズを計算してるんだろう。
これに関しては、"あいうえお\など0"例を書いて戴けると真に幸いです・・・イメージしにくいのでorz
>>685 一つ目はそのコード書いた人に聞いてくれよw
正直何がしたいのかよくわからんです。写し間違えしてない?
二つ目は、
char str[80] = "abcde";
とすると、
sizeof(str) == 80
strlen(str) == 5
だから、strの残りサイズは、80 - 5 - 1 = 74となる。(最後の-1はヌル文字の分)
strncatに74を渡すことで、あと74文字までつなげられるぞと言ってるわけ。
char←これって本当は何て読むのおすえて わたくしは、「ちゃー!」って呼んでます
世界的及び日本の大部分ではチャーですよ
ありがとうございます ついでにいいですか? C++←これは何てよむのですか わたくしは、「シープラ」って言ってるのですが、隣の人が「シープラプラ」だというので
世界的にはシープラスプラス 日本ではシープラプラが多いです
691 :
685 :2008/02/07(木) 04:13:09
>>686 ありがとうございました。
理解できました、参考書を見直しても写した通りです。
692 :
685 :2008/02/07(木) 04:55:24
>>686 度々、申し訳ありませんが
結局は"strncat(str1, str2, sizeof(str1) -strlen(str1) -1)"
こうする事で何の意味(意義)があるのか、詳しく参考書に書いてありません
簡単にセキュrティ云々としか書いてありません
普通に"strcat(str1, str2)"で繋げてはいけないのでしょうか ?
693 :
685 :2008/02/07(木) 04:59:28
バッファオーバーフロー対策らしのですが どうして、これが対策になるんですかね
たぶん書いてあるだろ、理由も たとえば10文字しか入れられない領域に7文字と8文字を連結したらどうなる
まぁ、>682みたいな関数として成立していないようなサンプルが罷り通るようじゃオーバフロー対策もへったくれもないがな。 普通は、そこまでしてstrncat()なんか使わないし。
>>682 は絶対手で書き写した上、変な省略してるだろ。
str1 を初期化もしてないのに strcat/strncat なんてするわけがない。
つっこみは多々あろうけど、そんなもんだよ、参考書なんて
do{ fgets(str, 256, stdin); //色々処理 }while(str[0]); キーボードから入力した文字列で色々処理して、何も入力せずEnterを押したら終了、 という処理をやろうと上のようなプログラムを書いたのですが、Enterを押してもループを抜けてくれません。 fgetsでEnterを押すだけだと、ヌル文字だけの文字列は代入されないのでしょうか?
fgetsのドキュメント読め。終了。
改行文字を読み込むのを見落としていました。 お邪魔しました。
もう来るなよ
atoi をエートワッって読むのは第2外国語に仏語を選んだマイノリティー
La magie est un renvoi , echouant, mais une , fierte en tant que noble est forte exceptionnellement.
704 :
682&685 :2008/02/07(木) 17:19:15
皆さんレス遅れましたが、ありがとうございます
>>694 溢れてしまいます
>>695-
>>696 あまり、当てにしないようにします、かなり詳しい大先生方(皆さん)を当てにさせてもらいますw
あと、確認解釈の為、質問させて下さい整理できたので・・・
要するにこれは
Void bofw(const char *str2){
char str1[80];
strncat(str1, str2, sizeof(str1) -strlen(str1) -1)
>>686 で書かれているように、74文字までしか格納できなと解釈していいのでしょうか?
sizeof(str1) -strlen(str1)文字までしか格納できない
707 :
デフォルトの名無しさん :2008/02/07(木) 19:25:44
#define y1 234 #define y2 456 ・・・・ #define y99 10 x[0] = y1; x[1] = y2; ・・・・・・・・・・ x[99] = y99; こういうことをループを使って簡単にやる方法はないですか? いちいち手作業で代入するのが面倒くさいです
最初から代入しとけばええんちゃう?
いちいちdefineしたものを代入するより、 x[100] = {234, 456,……,10}って初期化したほうがよくね?
値に法則性もないのに手作業以外でどうやるんだよ?
>>707 #defineじゃなくてconst int hoge[]
みたいなので用意しとけば?Cなので配列の添え字とかには使えないのだけれど
712 :
682&685 :2008/02/07(木) 19:30:29
>>708 #define y1 234
#define y2 456
・・・・
#define y99 10
というフォマットでデータを複数保存していまして
別のデータを使うたびにいちいち手作業で代入するのが面倒くさいです
perl -e "printf qq/x[%s] = y%s;\n/, $_-1, $_ for 1..99;"
for(i=0;i<100;i++){ x[i] = y(ここにiという数字が入る); } みたいなことはできないんですか?
できるわけないじゃん
719 :
デフォルトの名無しさん :2008/02/07(木) 19:40:58
これって それぞれの変数の値ってどうなりますか? #include <stdio.h> main() { int z[] = {1,2,3,4,5,6,7,8,9}; int a = 10, c = 20; int *pt_a, *pt_b, d; pt_a = &a; pt_b = z; z[3] = *pt_a + 5; *(pt_b + 1) = c; pt_b += 2; d = *pt_b; pt_b += d; *pt_a = *(pt_b + 1); で printfで%dで出した場合 *pt_a *pt_b d z[1] z[2] z[3] の値はいくつになりますかね? 教えて下さい。
ファイルから読み込んだら?
>>719 目で追うの面倒いから実行させてみた
順に 7, 6, 3, 20, 3, 15
っていうか自分で実行してみりゃ一発でわかるだろうに、なぜ訊くか
>>713 define01.hとかにして必要なデータをincludeするか
ファイル操作つかえばいいよ
ファイル操作が分からないなら C言語 ファイル操作 でぐぐれ
723 :
デフォルトの名無しさん :2008/02/07(木) 20:52:51
srand(time(NULL)); 以外に別種の乱数が生成できるってやり方はないか?
724 :
デフォルトの名無しさん :2008/02/07(木) 21:08:09
日本語を入力してそれを変数に格納して日本語で出力する。 ここにgetsとか入れるとおもうんですがどうも上手くいきません #include <stdio.h> int main() { char szName[32]; printf("What is your name?---"); /* ここ */ printf("Your name is %s.\n", szName); return 0; } 初心者過ぎる質問ですが・・・
char szName[32] = "山田太郎"; として、とりあえずちゃんと日本語表示される?
gets( szName ); でいけるけど、gets使うのはなぁっていうのはまだ早いか。 とりあえずいける
だからgetsという存在そのものを無い事にすればいいのに、何故教えるのか?信じられないな
>>724 #include <stdio.h>
int main(int argc, char *argv[])
{
printf("Your name is %s.\n", argv[1]);
return 0;
}
としておいて、このソースでyournameという実行ファイルつくって
> yourname "山田太郎"
Your name is 山田太郎
みたいに引数で表示したい日本語文字列を与えるのは用途が違う感じ?
いきなりfgets教えて問題ないよな。 最初はstdin固定で。
731 :
724 :2008/02/07(木) 21:57:31
ここ数年仕事で日本語入力使わなかったらさっぱり忘れてしまって
いい感じのサンプルソースが見つからなくてどうも行き詰ってた状態です
思い出しながらやってるんですがgetsって何で嫌われてるんだっけ?
>>729 用途と言うより基本が思い出せないのでとりあえず関数内で収めてしまいたいのです。
最初の一歩がわかればあとは自分でいけると思うのですが・・・
>>730 kwsk
>>731 char str[5]
gets( str );
で aaaaaaaaaaaaaaaaaa
と入力した場合、
aaaa\n [aaaaaaaaaaa...] とオーバーしたものもメモリに書き込まれてしまう。
ようはオーバーフローを起こしてる。
本当に仕事で使ってるとは思えない無知さ。 日本の将来が危ぶまれる。
ぐぐれば一番に見つかるものなのに、それすらしない糞って 氏ねよ
736 :
724 :2008/02/07(木) 22:11:11
しぬなんてどうせやらないことにうんと答えるなんて……。
>>723 ちょっとまてその前にそのNULLは何だ
NULLはポインタに対して使うもんだぞ
739 :
724 :2008/02/07(木) 22:19:54
入門編ってのは嘘だったのですね・・・、
>>735 google使ってないわけないじゃないですか。
これ以上いると荒れそうなので帰るぜ('A`)ノ
fgets()を教えた所で、 今度は「.の前に改行が入っちゃうんですけど」とか言って、 自身では解決できずに再度質問するんだろう。
PGって色々自己主張強い人多いからな<ソースについての文句とか 俺も業務について2年目だけど、コードブロックそのものを改行を入れてしっかり書いてくれない人が嫌いだ if( 〜〜 ) { ←これ 改行してから書けといいたい
俺は改行する方が嫌いだよ
ifのあとにスペース入れない糞野郎には、そっとヘッダに罠マクロを定義してメチャメチャにしてやりたい
C言語で独習Cをやり終えた後に近藤 嘉雪のアルゴリズムとデータ構造 を読んでみたんですがちょっと読むのに厳しいような気がしてるんですけど これは、C言語がまだ理解出てないってことですかね?
いやプログラムとアルゴリズムは話は別。
>>743 たった2年で何を勝手なことを
K&Rすら改行していないというのにお前にそれを否定する論拠があるのか?
最初は改行してたけどスクロール面倒だからしなくなったな
人それぞれ書き方あるよなぁ 見づらくなければそれでいい
まともなエディタなら勝手にフォーマットしてくれるからどうでもいい
他人の書いた#ifでズタズタのソースをいじったときに、 改行しない { は括弧の対応が判別できなかった。 それ以降、自分では改行するようになってしまった。
>>752 それは #if を多用しないって考えるのが正解。
括弧の対応なんてエディタの力で簡単に判別できる そんなこと気にしてるようじゃ
そのエディタが判別不能だったんだよ。 少なくとも当時の秀丸は。
黙れジジイ
しかしジジイ連中がいなければ今の開発環境はない
しかし今ジジイ連中が黙っても今の開発環境はなくならない
いつまでも、昔はどうだったとか言う奴は邪魔でしかない
うっせえ、20代だよw
>>743 あなたはPASCAL 爺さん?それともVB坊や?
>>746 アルゴリズムはちょっとわからなければ、写経して実際に動かしてprintfやらお好みのもので経過を調べて、とにかく自力で体得するのが吉。読んだだけわからなくても、それが普通だと思います。まさしく今が習得すべき時期ですよ。ベストを尽くしてください。
べーしっ君
>>755 太古からある emacs でなんら問題ないのに、人はどうして見た目のよい糞エディタを使うのか?
>>748 やつに「K&R」 と言っても通じないんじゃないかな?
>>765 太古からの正当なる系統であるvimでなんら問題ないのに
人はどうして「純粋な」エディタとは言えないemacsを無理に使おうとするのか?
>>766 vi は作者自身が消えるべき、といってるくらいで、あまりにも機能がなさすぎ。vim は vi のイミテーションでしかない(と作者がドキュメントの冒頭に書いてる)。
いや、私は bash のキーバインドは vi にしている‥‥。
今日のエディタスレはここか。 とりあえずCtrlに画鋲置いといた。
イテッ
ざんねん!! わたしの ぼうけんは これで おわってしまった!!
おお770よ、しんでしまうとはなさけない
До свидания
Adieux
fopenでデータを書き出していって、ヘッダをつけようと fseek(fp, 0L, SEEK_SET);や rewind(fp); でファイルの先頭に戻して fprintf()でヘッダ部分を書き出しているのですが 書き出した分のデータが消されてしまっているようで データにズレが発生してます。 ファイルは if((fpo=fopen(OutFileName, "w")) == NULL){例外処理} で発生させています。 解決方法ご教授ください
すいません、最後から3行のところは fpoではなくfpです
>>775 次のどれか。
・ヘッダを「挿入」する手段はないので諦めて、一番最初にヘッダを書く。
・一旦ファイルを作っておいて、ヘッダだけのファイルと合成する。
>>776 レスありがとうございます
挿入できないのですか…
ファイルが大量にあって、今の方法だと後から挿入するしか手がない感じです
ナンテコッタイ
unix系なら、作ったファイルが body.data だとして、ヘッダとくっつけて whole.data を作るならこれでもできる。 system("echo header | cat - body.data > whole.data"); # popen("cat - body.data > whole.data", "w")の方が楽かも知れず。 つーか、fopen("w")した直後にヘッダを書くだけじゃん。
>>778 ありがとうございます。
fopen w の直後にヘッダ書いて出来ました
脳みそ足りてませんでした
780 :
デフォルトの名無しさん :2008/02/08(金) 21:54:44
どなたか 先日のC言語2級の解答分かる方いますかね..? 答え合わせしたいのですが... いないよなぁ
782 :
デフォルトの名無しさん :2008/02/08(金) 23:01:15
問? 0x1234を0x123fにするには (28) と (29) を行う。その演算子の 記号は (30) である。 また、上位1バイトを0にし、下位1バイトをそのままに するには、 (31) と (32) を行う。その演算子の記号は (33) である。 ビットを反転するには、 (34) と排他的論理和を行うか、ビット演算子の反転 を使用する。そのビット演算子(反転)の記号は (35) である。 (28)の解答群 ア 0x0000 イ 0x000F ウ 0x1230 エ 0xfff0 オ 0xffff (29)、(32)の解答群 ア 論理和 イ 論理積 ウ 排他的論理和 エ 否定論理和 オ 否定論理積 (30)、(33)、(35)の解答群 ア & イ | ウ ^ エ ~ オ ! (31)の解答群 ア 0x0001 イ 0x000f ウ 0x00ff エ 0xf000 オ 0xff00 (34)の解答群 ア 0x0000 イ 0x0001 ウ 0x1111 エ 0x1010 オ 0xffff
すみません。C初心者です。質問させてください。 Cのポインタをはずすことを何か一つの用語であらわすことはできますか? Perlなら\1を${\1}することを\1をデリファレンスすると言いますが、 Cではchar *aを*aすることをなんと言えばよいのでしょうか?
間接参照
785 :
783 :2008/02/08(金) 23:21:03
>>784 ありがとうございます。英訳的にはindirect referenceでしょうか。
参照というとC++の参照を思い出しますね。ちょっと紛らわしい。
786 :
デフォルトの名無しさん :2008/02/08(金) 23:26:43
問? キャスト演算子は、式の結果を一時的に指定したデータ型に変更するものである。例 えば、double型の変数aの小数点以下を切り捨てるには、 (36) と記述する。 キャスト演算子は (37) であり、算術演算子より優先順位が (38) ため、int型の変数a、bの除算を実数の精度で計算し、その結果をdouble型の変数c に格納する記述は (39) である。 また、キャスト変換はポインタにも有効であり、int型の配列の内容を1バイトずつ 参照することができる。 なお、次のプログラムの出力結果は処理系によって異なる場合があるが、本問では考 慮しないものとする。 #include <stdio.h> main() { int a[] = {0x01020304, 0x05060708}; int i; char *p; p = (40) ; for (i = 1;i <= 8; i++) printf(゙%x゙,*p++); }
>>785 ポインタからポインタが指す先のデータを得る操作をindirectionと呼ぶ
788 :
デフォルトの名無しさん :2008/02/08(金) 23:28:43
(36)の解答群 ア int a イ int (a) ウ (int a) エ (int) a オ a(int) (37)の解答群 ア 単項演算子 イ 関係演算子 ウ 比較演算子 エ 論理演算子 オ 条件演算子 (38)の解答群 ア 高い イ 低い (39)の解答群 ア c = a / b イ (double)c = a / b ウ c = (double)a / b エ c = (double)(a / b) (40)の解答群 ア char a イ char *a ウ (char) a エ (char) *a オ (char *) a
789 :
783 :2008/02/08(金) 23:29:58
>>787 たびたびありがとうございます。
デリファレンスに比べて日本人相手には使いにくいかもしれないですね。
790 :
デフォルトの名無しさん :2008/02/08(金) 23:31:07
以上が一部です ほんとは最後の問7 問8の答えが知りたいのですが 打つのが大変なんで... 文が見づらくてすいませんm(_ _)m 解答をお願いいたします。
丸投げするんなら、宿題スレにでも池
宿題スレで聞けば
その問題の答えが分からんのは重症だろ
C++ならint(4.34)でもいけるな
795 :
デフォルトの名無しさん :2008/02/09(土) 00:04:51
すいません.. 確かに重傷です..
カーニハンとリッチーはC言語習いたての俺ですら知ってるぞ っていうかCの説明の1番目に出てきた
797 :
名無し :2008/02/09(土) 00:33:17
C言語のコンパイルの仕方について質問です。 エディタでmainなどを説明通り打ち込み、.cで保存したテキストファイルを生成する事は出来たのですが、コンパイラをどのようにして使えばいいのかが分かりません。 色々ツールが入っていましたので、どれにドラックしていいのかわかりませんでした。 宜しければ、このコンパイラで、これが本体だよみたいな感じでお教えになってもらえれば幸いです>ω<
お前のパソコンの中身なんて知るかよw とりあえずコンパイラでググれ。
cc *.c[Enter] これでOK.
カーニハンって蟹チャーハンみたいで美味しそうで困る ときどきfloatも美味しそうに聞こえるから困る
802 :
デフォルトの名無しさん :2008/02/09(土) 01:28:10
ほんとすいませんm(_ _)m どなたか解答をお願いいたします。
>>801 俺はカーニハンって聞くとカニバリズムを思い出して、
リッチと聞くとなんか怪しい魔法使いか何かじゃないだろうかと、
ワルプルギスの夜のような印象を受ける。K&Rを見ればコリアを思い出す。
このコンパイラってどのコンパイラだよwwww
ぷよぷよを作っていたコンパイラのことだ
今は亡きコンパイルを偲ぶ
>>782 >>786 (28)イ
(29)ア
(30)イ
(31)ウ
(32)イ
(33)ア
(34)オ
(35)エ
(36)エ
(37)ア
(38)ア
(39)ウ
(40)オ
アリアハンが中華メニューに聞こえるようなもんか
>>785 英語だとdereference。
規格では間接参照と訳されているが、
参照剥がし、参照外し、逆参照なんかもよく聞く。
脱参照というのも見た事がある
*が肛門の穴に見えるので脱糞というのも捨てがたい
俺は参照戻しと呼んでいる。
デリファレンスでいいじゃんといつも思う。
あえてポインティーと呼びたい。
今日の2級に受かりたいです。お願いします
>>790 こいつに問7、8を書いてやってくれ
解答は俺が担当してやる、問題用紙がないのでね
宿題スレでやれって書こうと思ったらマルチだった
819 :
デフォルトの名無しさん :2008/02/10(日) 12:45:01
問8 /*語尾変換プログラム*/ #include <stdio.h> #include <stdlib.h> #include <string.h> int f_read(void); int w_cnv(int ln); #define CHRSIZE sizeof(char) char str[20][(254 + 2)* CHRSIZE * 2 + sizeof(char)]; main() { int ln; int i; int cnt; ln = f_read(); cnt = w_cnv(ln); for(i=0;i<ln;i++) printf("%s",str[i]); printf("\n文章中を%d件変換し、\n",cnt); printf("文末を%d件付加しました。\n",ln); } /*ファイル入力*/ int f_read(void) { FILE *fp;
820 :
デフォルトの名無しさん :2008/02/10(日) 12:55:33
char buf[256]; int cnt = 0; if((fp = fopen("word.dat","r")) == NULL){ printf("入力ファイルがオープンできません\n"); exit(1); } while( (46) != NULL) (47) ; fclose(fp); return(cnt); } /*変換*/ int w_cnv(int ln) { int i; int cnt = 0; char w_str[256]; for(i=0;i<ln;i++){ while( (48) != NULL){ strcpy(w_str,strstr(str[i],"な") + CHRSIZE * 2); strcpy(strstr(str[i],"な"),"にゃ"); (49) ; cnt++; } strcpy( (50) ,"にゃ\n"); } return(cnt); }
821 :
デフォルトの名無しさん :2008/02/10(日) 13:10:32
(46)の解答群 ア fgets(buf,255,fp) イ fgets(fp,buf,255) ウ fscanf("%s",buf,fp) エ fscanf(fp,"%s",buf) (47)の解答群 ア strcpy(buf,str[cnt++]) イ strcpy(buf,str[cnt+1],buf) ウ strcpy(str[cnt++],buf) エ strcpy(str[cnt+1],buf) (48)の解答群 ア strcat(str[i],"な") イ strchr(str[i],"な") ウ strcpy(str[i],"な") エ strstr(str[i],"な") (49)の解答群 ア strcat(w_str,str[i]) イ strcat(str[i],w_str) ウ strcpy(w_str,str[i]) エ strcpy(str[i],w_str) (50)の解答群 ア strchr(str[i],`\0') イ strchr(str[i],`\n') ウ strchr(w_str[i],`\0') エ strchr(w_str[i],`\n') 文中の「な」を「にゃ」に変換し、さらに文末の語尾に「にゃ」を付加して表示するプログラムです
で? それがどうしたい?
本人は面白いこと書いたつもりでいるんだから、そっとしといてやれよw
824 :
デフォルトの名無しさん :2008/02/10(日) 13:57:12
ほんとすいませんm(_ _)m 度々の投稿で荒らしてしまって... 申し訳ないです..m(_ _)m 解答が知りたかったもんで..
さすがにそれは宿題スレで聞けよ
C言語でプログラムを作っているのでここで質問します。 16進数でテキストファイルに以下のように書き込んでいるのですが、 01ABD 03DAE これをASCIIコード形式で出力することはできませんか? わかる方教えて下さい。 環境 WindowsXP 開発環境 VS2008EE
>>826 char str[] = "DDDD";
printf("%d", str[0]);
見たいな感じで出せばいいだけじゃないの?
<<827 確かにできそうですね。とりあえず、それでやってみます。 レスありがとう
printf("%02X" ・・・ あたりのほうがよくね?
830 :
デフォルトの名無しさん :2008/02/10(日) 19:52:57
C言語で有名なロギングライブラリってどんなのがありますか? ちなみにlog4cっていうのを見つけて、VCビルド用のMakefileでnmakeしたら 構文エラーが・・・ log4cのdllってどこかにないでしょうか?
>>830 Windowsならイベントログに書き出すとか。
834 :
デフォルトの名無しさん :2008/02/10(日) 20:44:50
GNU makeのファイルをnmakeに変換するソフトくらいありそうだからぐぐってみ
>>834 ありがとうございます。
とりあえずmingwのmakeでmake自体は動きました。
しかし、コンパイルエラー・・・
../src/log4c/rc.c(335) : error C2017: エスケープシーケンスの使い方が正しくありません。
もう少し粘ってみたいと思います。
>>833 そこAnonymousならパスワード訊かれてもただEnter叩くだけって書いてあるじゃん。
>>836 うおwちゃんと書いてあったのですね。(吊
ありがとうございます。
838 :
デフォルトの名無しさん :2008/02/10(日) 21:50:12
データベースMySQLのソースを解析しているのですが、 EMBEDDED_LIBRARYというdefineがあるのですが、 これって何のためのdefineでしょうか? また、こういうdefine変数の意味の調べ方ってどうすればよいのでしょうか?。。
grepれ
840 :
830 :2008/02/10(日) 22:00:15
おかげさまでlog4cのdllが完成し、リンクできるのを確認しました。 CVSからエクスポートしたあとmsvc6のフォルダにあるMakefileをmingwのmakeでmakeしました。 このときVC2005のcmd経由で使う場合はMakefile中のダブルクォートのエスケープが [\"]ではうまくいかないようなのでシングルクォートで囲みました。 最終的にmakeはエラーでとまってしまったのですがdll自体のビルドは完了しており、 サンプル関連のファイルを作成する部分だったので無視しました。
841 :
830 :2008/02/10(日) 22:04:12
ちなみにVC2005でのコンパイルはMakefileの↓の部分でMSVC8を指定しました。 MS_COMPILER_VER=MSVC8 連投ですみません。 以上、参考まで。
>>838 VisualStudioのようなIDEやEmacsやVimなどのtags
とくにGNU globalなんかを使うと便利ですよ
8バイトや16バイトのサイズを取った変数を charやintみたいに定義することってできるでしょうか?
>>843 聞きたいことがわからん。
型を定義したいならtypedef
typedef int MyIntger;
typdef struct tagHoge HOGE;
C99ならint8_t ? int16_t?
それともビットフィールド?
そ、そういうことだったのかorz
ごめんなさい、説明不足でした 例えばcharなら1バイト、longなら4バイトみたいにサイズ取られてますが そんな風にtekitouは16バイトっていうような型を作りたいんです
typedef struct { char c[16]; } tekitou; tekitou x; /* 16バイト */ こんな感じか?
>>848 は16バイトの大きさをもった整数みたいにしたいんじゃないかな?
そうじゃないなら
>>849 でおkだが・・・
64bitくらいまでなら規格や環境によってはあるがそれ以上を好きにとなると自作するしかない。
多倍長演算とかでぐぐればいろいろ見つかる。
えと、取ったサイズ分の幅の数値を扱いたいので配列じゃないです
16バイトの整数型が提供されていなければ、諦めましょう。 自分で16バイトの数値を計算するプログラムを書いてやる必要があります。
多分
>>850 さんの言ってることだと思います
取り合えず多倍長演算をぐぐってみます、説明下手で申し訳なかったです
レスくださった方ありがとう
すいません、質問です。 int test[256][256]; 例えばこういう変数を作ってその中身を保存しておきたい場合、 どういう方法でやるのが良いのでしょうか? もしくはどんなキーワードでググればおkでしょうか。
fwrite(test, 256*256, sizeof(int), fp);
>>855 ありがとうございます、早速調べてみます。
>>855 ダウト
そこは、fwrite(test, sizeof(int), 256 * 256, fp)のように「要素サイズ」と「要素数」を適切に使うべき。
書籍を読んでC言語を勉強してます。 入門書を2冊ほど読み終わった程度なのでレベルはとても低いです。 そこで質問です。次に勉強しようと思ってる事なんですけど Windowsでなにかしらプログラムを作る勉強をしようと思ってます。 VisualC++を開発環境にした書籍がとても多いんですが (「Visual C++〈1〉はじめてのWindowsプログラミング」とか) WindowsでC言語を勉強していくのでしたら、こういった本で VisualC++を勉強していけばいいんでしょうか? C++全然わからないんで、VisualC++使えるのかどうかも不安なんですが・・・ わかりづらい文ですみません、ご教授お願いします
VC++でもCはコンパイルできるよ。
本に頼るならapiを扱った書籍 あとはソースが公開されているようなのを拾ってきて他人の作ったプログラムを まずは読んでみるのがいいと思うよ vc自体はコンソールプログラムのプロジェクトを作ってコンパイルの流れを掴むといい
861 :
858 :2008/02/11(月) 22:38:41
>>859 C++使えなくても問題ないってことですよね?
安心しました、書籍探してもC++の事ばかり書いてあったんで
>>860 apiがさっぱりわからないんで、本読んで勉強してみますね
Cの基礎勉強してから人のソース読んでも見慣れない単語が多かったのは
apiだったと最近知った程度のレベルですw
Visual C++というソフトウェアはCもC++も対応しているけど、 書籍でVisual C++と言っていれば、C++使っている可能性が高い罠。 立ち読みして確認しておくべし。
863 :
858 :2008/02/11(月) 23:36:08
>>862 う〜ん気をつけないと駄目ですね・・・
いつもアマゾンで本買いますけど、VCの本は本屋行って確認してきます
コンソールプログラムだけなら 本とか無くても作れるだろうから まずはそれで慣れたらどうよ?
VC++の本ってMFCだったりするから注意な。
MFCって無いとダメなもの? ラッパーだからWin32APIをウィザードのように使いこなせればおk?
>ウィザードのように 「次へ」を連打してる姿を想像した
>>866 むしろ無しでいけるならなしの方がいい。
API使いこなせるならそれでおk
>>867-869 レスありがとう。
今までC#やらJavaやらHaskellやらテキトーにやってきたけど、
>>869 のWindowsプログラミングやってみたら案外面白かった。(Eclipse+CDT+MinGW)
871 :
858 :2008/02/12(火) 08:36:04
おはようございます
>>864 流石にそろそろマウスだけでも動かしたくて・・・
もう演習問題をやるのは飽きましたorz
>>865 MFC・・・APIとの違いがよくわかりませんが注意します
もう少し用語の勉強もしないと駄目ですねorz
>>869 ありがとうございます
人のお勧めとかの本はすぐ手をだしてしまう性分なので
もう今すぐ買ってしまおうかと思ってますw
スレチうぜーよ
#if #elif #endif の使い方のことなのですが これでif部分を分岐させるためには #defineで何がしかのフラグを建てないとダメってことですよね?
普通はそうする。 でも例外として、コメントアウトの代わりやコードの切り替えに #if 0 や #if 1 を使うことはある。 ネストできるのがポイント。
#defineを書くとはとは限らず コンパイル時にオプション-DDEBUG見たいな感じで渡すこともあります
>>874 なるほど
「今回はココスルーしておくか」ってときに
#if0にしたりするのですね。
>コンパイル時にオプション-DDEBUG見たいな感じで渡すこともあります
argv[]に入れるときみたいな感じで
コンパイル時にDEBUGが入ってくる、ということですよね?
そのときはDEBUGの部分のソースが回る、ということですね
なんとか整理ついてきました!ありがとうございました!
なぜグローバル変数は嫌われているの?
>>877 嫌われるに値するだけの理由があるから。
入門者は取り敢えず、そういうもんだと思えばいいことです。
>>877 int global; というグローバル変数があるとする。
ローカル関数の中で、
static void foo(void)
{
global = 3;
違う関数();
printf("%d\n", global);
}
こんなコードで、画面に「3」が表示されることは期待できない。違う関数()の中でglobalの
値が変わっているかもしれないから。
このように、プログラムの見通しが極めて悪くなる元凶だから。
スコープは狭い方がデバッグしやすい。
他にも、グローバル変数を利用する関数は再利用がしにくくなるとか、 他の人もグローバル変数を使うと名前が衝突しないかチェックしなきゃいけないとか。 とにかくデメリット満載。
書式指定フィールドってのがよく分からないんですが %{flags}[width}{precision}[typeのオウレティックス]type え?何コレ、復活の呪文?%typeとか書けばいいの?
>>882 多分具体例と表示結果みたほうがてっとりばやいかと
まあC言語で大規模なプログラムを作るならグローバル変数を使った方がいい場合もあるけどな。 クラスのプライベート変数だってCで記述するところのファイル内にスコープが閉じたスタティックなグローバル変数みたいなものだし。
>>882 オウレティックスって何だそれ。
プレフィクスの間違いか?
>>882 {flags} は + とか - とか 0 とか
{width} は幅 (≒文字数)
{precision} は精度
{typeのオウレティックス} は l とか h とか
type は s とか c とか d とか
例えば、flags が 0 で width が 3 で精度省略で type が d だと、 %03d になる
括弧の外で宣言されたスタティック変数ってグローバル変数に分類されるんだっけ?
>>887 どの括弧だよ・・・
そとにstaticで書いた場合はそもそもstaticで得られる意味が違う
「グローバル変数?どこからでも値使えてうめえwwww」 とか思ってる糞初心者の俺にはありがたい流れだ
どこからでも使えない方がうめえんだな、これが。
>>887 { } の外の事なら Yes.
内部リンケージのグローバル変数になる。
外部リンケージのグローバル変数よりゃいくぶんかマシ。
子供のころは部屋におもちゃ散らかして、 どこからでも取れてうめぇwwww って思ってるけど大人になると、 どこ歩いてもぶつかってうぜぇwwwwwwww ってなるようなもん。
ごめん。俺、部屋散らかってる方が安心するわ。 グローバル変数は使わんがな。
部屋が散らかってないとそわそわしちゃうよな
散らかった部屋で仕事したいかな
デスクトップのほうが散らかってる
デスクトップはアイコン0じゃないと落ち着かない
Cでもオブジェクト指向は可能ですか
可能だよ。
>>898 ちょっと頑張ればアセンブラでも可能だけど…
オブジェクト指向プログラミング言語ではないから、 言語仕様・ライブラリ面での支援がないというだけのこと。
どこまでのことができれば 「可能」 と言える状態なのかの 要求レベルによると思う。 C++ をコンパイルして吐かれたアセンブリ言語のコードと 同じようなコードを書いたとして、 果たしてそれは 「オブジェクト指向」 と言えるのかというと、 俺は正直微妙だと思う。 特にアクセス制限まわりが。
もうオブジェクト指向"風"プログラミングでいいよ
シューティングゲームを制作中です。 スコア表示に悩んでいます。 既にfpsを表示させているので、そのfpsの下に表示させたいです。 ソース下の方に"敵爆破"のコードが書かれているのですが、そのコードの中にスコア加算すると考えています。 使用:Visual C++ 2005 Express Edition OS:Windows XP
誤爆なのか書きかけなのか区別つけにくいな
>>902 >C++ をコンパイルして吐かれたアセンブリ言語のコード
たとえばメソッド探索について言うと、C++のような静的型付けの言語の場合、
コンパイル時にある程度解決できるので、例としてあげるのはどうかと思う。
アセンブラでやるなら、型情報を持ったレコードを定義してマクロ使うとか、
ディスパッチャ呼び出すとかするんでないかな?
だいたいの言語でオブジェクト指向はできるが 断じてそいつらはオブジェクト指向言語ではない。
僕のコードはいつだってカオス指向 ときどきコードなのか日記なのか判らなくなる
Cで継承とかできるの?
同等のものを作ることは出来るだろ。 コンパイラのサポートは受けられないけど
フィールドへのアクセシビリティの制御は?
わかってて聞くなよ おもしろいか?
実行コンテクストに資格情報を発行すればいいんじゃね。
まあ使う人次第ってこった。 C++でもクラスのメンバ変数全部publicとか燃やしたくなるコードを書く人もいる。
C++だけど全部シングルトンパターンとか
スレタイ嫁
>>911 こんな感じ。
/* Hoge.h */
#pragma once /* 面倒臭いからこれ使わせて */
typedef struct Hoge Hoge;
Hoge *Construct();
void Foo(Hoge *hoge);
void Destruct(Hoge **hoge);
/* Hoge.cpp */
struct Hoge {
int foo; /* Hoge.cpp 以外からは触れない */
};
Hoge *Construct() { return (Hoge*)calloc(1, sizeof (Hoge)); }
void Foo(Hoge *hoge) { printf("%d\n", hoge->foo); }
void Destruct(Hoge **hoge) { free(*hoge); *hoge = NULL; }
とりあえずRubyはCで書かれてるんで、少なくともあの程度には
プロトタイプベースなオブジェクト指向は出来るんじゃね?
メリットあるとは思えないが。
それと「OOPLと同等のソースコード」を書き上げるのはCではムリだろ。
>>911 メンバ変数/関数として変数名、値を保存するバッファ、アクセス属性を持った
構造体のリストを持った構造体をクラスとして宣言して、動的にクラスを作っていけば
実行時にエラー出す程度のことは出来る。
C++やJAVAのような「ソースコード」をCで書くことに拘りすぎ。
fgetsとatoiの組み合わせでキーボードから数字を読み込む処理をしていて、 int data = 0; char temp[32]; do{ fgets(temp, sizeof(temp), stdin); data = atoi(temp); }while(data); 数字が入っていないとatoiの戻り値が0になるのを利用してこんな風に書いていたのですが、 dataに0も含む数値を入力するようにしたくなって困ってしまいました。 atoiの戻り値が0を入力されての0なのか数字が入力されなくての0なのかを判別したり、 tempに数値が入っているかを判別したりできる関数はありますでしょうか?
strtol
sscanf でもいいと思う。
>>920 はatoiの代わりだな。
数値かどうかなら、1文字目を isdigit する手もある。
ホワイトスペースをどう扱うかも問題だな。
strtol()の戻すポインタを調べれば、変換に何処まで使ったか判る。 sscanf()で同じことをやろうと思ったら、%nで取得する必要がある。
sscanf の戻り値使えよ
>>926 文字列のどこまで変換に使ったかは戻り値じゃ判らんのだよ。
そんな情報が要るとはどこにも書いてないがな
要らないとも書いてないねぇ。
要らないと書いてないものは無数にあるのに、 そのうちの一つを取り上げて、勝手に要るものとして扱うのはいかがなものか。
931 :
とけび :2008/02/15(金) 14:39:40
教えてくださいませ。 ファイルの出力先のディスクの空き容量のチェックするところを 作成中なのです。 空き容量までは調べられたのですが、マウントポイントでいうところの どこなのか?が調べられなくて困っています。 環境はVineLinuxです。 ディスク容量は、「statfs」で調べました。 dname = strdup(filename); dirname(dname); if (statfs(dname, &stStatfs) == 0) { fprintf(stderr, "空きサイズ : %d\n", stStatfs.f_bfree*stStatfs.f_bsize); } 分かる方よろしくお願いします。
popen("df -k", "r")じゃいかんの?
>>929 必要になる可能性が高いモノではあると俺も思う。
>>928 間違ったからといって「けっ そんなのいらねぇや」は、小学4年生までな。
おじさんとの約束だ。
書いてないんだから、両方提示すればいいだけで 一方的に否定するもんでもないと思うけどな
元の質問をすっかり忘れるよりマシだろ。
>>933 元の質問を考えれば
要らないとしか言いようが無い
そりゃ atoi 使ってるくらいだしな。
atoiでは検出できないから修正したいって流れが読めない自演乙。
検出したいのは0と区別したいだけだろ、わかってて無知のふりしてるのか。
途中に数字以外の文字が入ってようが、先頭文字が数値ならatoiは変換する。 つまり、0のときどちらかが知りたいのならば、数字じゃない文字の位置は関係ない。
つまり、変換が終了した時点でその文字列に数字以外があったか無かったかatoiでは検出できない。
そこで sscanf ですよ。
sscanfでも途中に数字以外が合っても先頭から並んでいる分の数字だけ変換するような気がするんですが どうやって検出するのか教えていただけないでしょうか
>>943 どんな文字列をどういう風に変換したいんだ?
int n; if(sscanf(buf, "%d", &n) == 1) { 先頭に数値があった } else { 先頭に数値がなかった }
今日からプログラミングを始めた初心者なんだが、
#include <iostream.h>
void main()
{
int i;
i = 5 + 15;
cout << "計算すると";
cout << i;
cout << "になります。" << endl;
}
っていう簡単なプログラムを組んで、デバッグしようとすると、
fatal error C1083: include ファイルを開けません。'iostream.h': No such file or directory
っていうエラーが出てデバッグできないんだ。
プログラム以前の問題で申し訳ないが、理由が想像できる人いないか?
環境はVisual C++ Express Editionで、
http://lets-go.hp.infoseek.co.jp/c_setting09.htmlに書いてあることは一通りやったと思う 。
.h なしで #include <iostream> でどう?
>>947 エラーが増えた…。
error C2065: 'cout' : 定義されていない識別子です。
error C2065: 'endl' : 定義されていない識別子です。
って言われた。
>>948 cout → std::cout
endl → std::endl
ってやるのが面倒なら
using namespace std;
>>948 エラーの”数”は気にしなくていい。
1つ目のエラーが、より”後ろ”にずれたら、ある意味改善したと思っていい。
>>948 やってみたら、ビルドの時点で
LINK : fatal error LNK1104: ファイル 'user32.lib' を開くことができません。
って言われたんだが、どういう意味か分かるか?
952 :
951 :2008/02/15(金) 23:33:08
すまん、
>>951 は
>>949 に対してな。
>>950 プログラミング以前の問題(多分環境設定)でつまずいてるんで、後ろ云々の問題じゃない気がする…。
素人考えで違ってたらすまん。
>>943 sscanf()の場合は、例えば"%d%n"としてどこまで変換したか取得すればいい。
strtol()なら、ポインタを用意しておけばそこにどこまで変換したかを設定してくれる。
どちらの場合も、変換に使わなかった最初の文字を指しているから、その先に
ナル文字があれば全て変換された(=数字文字のみ)ことが判る。
>>946 今日から始めるなら、
なんでViusal C++ 2008にしなかったんだい。
なんで946のような古い書き方をしているんだい。
そんな古い資料、よっぽどの名著でもない限り窓から捨ててしまえ。
>>952 さっきのページの、ライブラリファイルのディレクトリの追加はやってるか?
そのディレクトリにファイル user32.lib はあるか?
>>950 参考にしているサイトやら本やらをもう1回見直して間違いないなら他を参考にしたほうがいい
>>954 とりあえずプログラムの勉強始めようと思ってぐぐったら、紹介されてたのが2005だったんだ。
まずはプログラム組めるようになりたかったんで、動けばなんでもいいかなー、と。(実際、動かせてないんだが)
とりあえず2008に移行してみるよ。
アドバイス、サンクス。
で、なんで>946は教わる立場の割に態度がでかいの?
959 :
943 :2008/02/15(金) 23:56:47
デバッグという言葉は知っているが意味を知らない所から推測するに なんちゃって管理者っぽいことをしてたんじゃないか?
962 :
とけび :2008/02/16(土) 12:08:37
931です。 いろいろ調べましたら、debianのdfのソースやfreebsdのソースを 見ることができたのですが、OS依存やシンボリックリンクで 異なるマウントポイントになっているのを検出が面倒なので 932の方のやり方で対処しました。 ありがとうございます。
963 :
デフォルトの名無しさん :2008/02/17(日) 19:38:36
はじめましてです。 IT関係の仕事に転職を考えていてC言語、JAVAという言葉を知っているのですが何から手をつけたらいいか分かりません。 今やっていること。 基本情報処理の資格本購入。 初級シスアドの資格本購入。 自作PCの本の購入しPC内部の基礎を学ぼうと思いました。 希望職種は、システム運用を希望しています。
>>963 買うだけじゃなくて試験もうけろ。もうすぐ締め切りだぞ。
あと、自作で何か作れ。パクリでもいい。むしろパクれ。世に出さなくていいから。
本って買うだけで頭よくなった気がするよな
初級シスアドの本はとりあえずゴミ箱いきでもよくね? 役に立たないことで有名かつ、もうすぐ試験そのものがなくなるし・・・ 言葉を知ってるだけ、本を持つだけ、学ぼうと思うだけなんて小学生でもできる。 転職考える人間ってことは社会人でしょ?自分でとりあえずやってみるって選択肢はないのか?
>>963 >何から手をつけたらいいか分かりません
まず本を読むところからはじめればいいじゃないか
>>963 JAVA 程度のことは常識として知っておかなくてはならないと思います。
C も同じく、かもしれませんが、素直にどうぞ、とはいえないつらさがあります。
今なさっていることで、間違いはないと思います。道のりは長いのですが、
いずれ知らなければならないことですから、回避するわけにもいきますまい。
いろいろ知るうちに、より詳しい方向性が見えてくるかもしれません。
>>963 私がいる…
職業訓練校でシスアド勉強したけど、イマイチ…
現在、サバ管やってみたくて求職ちう。
>>964 作れ、といったところで、963はCやJavaが
プログラムを作るためのものであるということを
認識していない可能性が考えられる。
Cっておっぱいまでだっけ?本番だっけ
中出しまで
973 :
デフォルトの名無しさん :2008/02/17(日) 22:56:04
ちなみにC++っていうのは合成するとC* つまりアナルまでってこと。
974 :
デフォルトの名無しさん :2008/02/17(日) 23:00:38
軽く席替えプログラムなんか作ってみてくれ
どうやっても意中の彼女が隣の席になりません
仕様です
977 :
デフォルトの名無しさん :2008/02/17(日) 23:27:17
60点だな大アマでだぞ
978 :
デフォルトの名無しさん :2008/02/18(月) 00:17:52
963です。 970さん、、、すいません。知りません。 すこしずつ、覚えていきます。 覚えるのにいいプログラムとかあれば教えてくただければ幸いです。 今の仕事は、一応保守になりますけどITではなく機械のメンテをやっています。 そこの仕事はまだITの知識は必要ないし、業界的にも下火でもうやっていっても会社があり続けるか 不安でそんなところにしがみつくよりも転職活動を始めて転職できるときにしたいと思いました。 世の中不安のない業界なんてないぞといわれそうですが、潜在的でもなくももうすでにあちらこちらで その兆候が表面化していて危ないぞという話ではじめている。 しかも、職場の雰囲気も最悪でブラック企業そのもので昭和の高度経済成長初期の考え方みたいな感じで 分かりやすく言うと気合だけ体育会系の不良ばかりの部活みたいな感じです。 なので、できるときにできることをする。 自分の人生なので、悔いのないようにしたいので転職を考えて、転職先としては、同じような感じではあるが 知識は全く別物のシステム系の運用サポートを考えています。 ただ、どんな業界のどんなシステムの運用にするかはまだよく分かっていません。 これからそういったところも勉強していきたいと思います。
いい文章だが読むのがめんどい
システムの運用に必ずしもエキスパート並のプログラムの知識が必要というわけでない。 機器メンテだってフライスやネジ加工の知識なくてもやっていけるが同分野の知識ならあるに越したことはないって感じだろ? どっぷり一つの知識のエキスパートになるのもいいが、それだと結局今のように 先行きが不安になってくると鞍替えすることになってしまう。 まずはどういう分野がありどういう知識があるのかを知るのが先かな?
ダメな奴は何をやってもダメ
自己紹介されましても。
>>963 午後問題のプログラミングは、
参考書2冊、プログラム専用基本問題集4冊 合計6冊を二年がかりで潰して
ようやくコードが読めるようになったyo
午前はまだやってない
どちらかといえば午前の方が難しかったりする
午後は時間が足りない
午後は眠くなる
午後は文章読解力の問題
>>978 この業界で転職をするんだったら、資格より業務経歴書が重要
自分で勉強をするよりどっかの会社にもぐりこんで業務経験をつむのがよろしいかと
忠告
IT業界もブラック企業ばかりだから、転職には十分注意を!
中にはまじめな会社がある
基本的に小規模な会社って良心的じゃね? 以前全従業員50人くらいの会社で働いてたけど、いろいろと融通きいてくれたり、無理すぎる体制とか受注しそうになったとき、上の人が断ってたりしてくれてたな。 で転職で今は全部で20人くらいの超小規模だけど、こっちも同様に社員のことを大事に扱ってくれてるな。 大手企業に就職した知人はノイローゼ気味になってる・・・
20人で小規模なん?
>>990 全従業員たった20人だよ。
小さい会社っしょ?
その分気楽にできるからいいけど。
まー大企業だと上のやつらは社員の名前すら覚えてないからなー いわゆる使い捨ての駒のような感覚で扱ってるんだろ
994 :
デフォルトの名無しさん :2008/02/18(月) 22:33:33
int array[10]; int *ptr; ptr = array; 配列名の後に[]をつけずに、配列名だけ単独で書くと[配列の先頭要素へのポインタ]という解釈は間違っていますか? 厳密にお願いします。
合っている。 式の中では、配列型はポインタ型へ暗黙の変換を持つという規則がある。
>>996 という規則はあるが、例外があり、sizeof, &のオペランドの場合は例外。
998 :
デフォルトの名無しさん :2008/02/18(月) 22:40:35
なるほど、ありがとうございます。
_ミ`ー‐、 `⌒丶、'ー-、_ + 十  ̄\―ヽ._ 二_‐- \ \  ̄ ‐-  ̄二二_ ―_,r'⌒ヽー、  ̄\ ̄ \‐- ╋__..ニ -―― ´ ̄ __... -―一┘ + ニニ ー--\ ⌒Y´ ̄ `丶 __ __,. -‐二´  ̄ ― _ ヽ.._ ^ω^ ノ -‐ /⌒ 丶' ⌒) バカにはコピペできないカッコいいAA / ヽ / / / /へ ヘ / /l / \ ヾミ // (__/| \___ノ/ 〉 / -=≡ /⌒⌒ヽ/⌒ヽ/\ -=≡ ./⌒ヽ, /  ̄ \\ ヽ/⌒ヽ, -=≡ / |_/__i.ノ ,へ _ _/ \\/ | /ii -=≡ ノ⌒二__ノ__ノ  ̄ ̄ \ヽ |./ |i -=≡ ()二二)― ||二) ()二 し二) ― ||二) -=≡ し| | \.|| .| .|\ || -=≡ i .| ii i | .ii -=≡ ゙、_ ノ .゙、 _ノ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。