- 1 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 15:48:19 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 59 pc12.2ch.net/test/read.cgi/tech/1263014439/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★初心者、初級者の方は他の質問スレのほうが良いかもしれません。 例えば 【初心者歓迎】C/C++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
- 7 名前:デフォルトの名無しさん [2010/01/31(日) 17:36:08 ]
- #include <stdio.h>
void disp_2D_array(int nrow, int ncol, double *a_p); int main(void) { int nrow = 3, ncol = 3; double a[3][3] = {{1.56, 3.24, 5.24}, {3.24, 6.23, 8.16}, {7.32, 2.86, 4.12}}; disp_2D_array(nrow, ncol, &a[0]); return 0; } void disp_2D_array(int nrow, int ncol, double *a_p) { int i, j; for (i = 0; i < nrow; i++) { for (j = 0; j < ncol; j++) { printf(" %7.2f", *a_p); a_p++; } printf("\n"); } } というプラグラムのa_p++;はなにを意味しているのですか?
- 8 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 17:48:40 ]
- ポインタを進めている
- 9 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 17:54:30 ]
- >printf(" %7.2f", *a_p); a_p++;
この部分、 printf(" %7.2f", a_p[i * ncol + j]); と同じ
- 10 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 18:09:46 ]
- >>6
半角カナはchar1個分なのにマイナスってことじゃないの? よくわからんけど
- 11 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 19:39:57 ]
- #include <stdio.h>
int main() { if ('ア' > 0) printf("plus.\n"); else printf("minus.\n"); return 0; } を実行すると、 minus. になった。半角カナは負数扱いらしい。
- 12 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 19:52:29 ]
- そうなったのは、そのソースファイルが SJIS になってるからでは?
- 13 名前:デフォルトの名無しさん [2010/01/31(日) 19:59:34 ]
- >>7です
a_p++; がなくてもfor文があるからいいわけではないんですか?
- 14 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 20:05:47 ]
- いいけど、a_p は ++ されないよ
- 15 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 20:08:34 ]
- 32Bitマシンと64Bitマシンって何が違うんですか?
コンパイラは違いを吸収してくれますか?
- 16 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 20:28:48 ]
- 32ビットマシンの場合はint, long, pointerが全部32ビットなので、それら
の区別をあいまいなまま使用しても動いてしまった。 64ビットマシンの処理系はint 32ビット、longとpointerが64ビットのデータモデル を使っている場合が多い。書き換えが必要になる場合がある。
- 17 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 20:29:32 ]
- >>11
試しにif内の0をunsigned intでキャストして実行してみろ
- 18 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 20:51:51 ]
- >>16
ポインタサイズがちがうということは32BitでビルどしたDLLを64Bitで使うとかすると死ぬわけですね dでした
- 19 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:01:17 ]
- いつもgccでmakeしてるプログラムが有るんだけどVisual C++で同じようにコンパイルできる?
とりあえずVisualStudioインストールして少しいじってみたけど分からない
- 20 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:04:10 ]
- makeの形式が違うだろ
自動変換できる風呂グラムでもあれば出来るが
- 21 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 21:22:13 ]
- >>18
64ビットプロセスから32bit dllはロード出来ないから安心しろ。 そこいら辺はOSがよきにはからってくれる。
- 22 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 13:07:44 ]
- #include<stdio.h>
int main(){ int x=1; int i; while(x!=0){ printf("数値を入力してください\n止めたい場合は0を入力してください\n"); scanf("%d",&x); if(x==2)printf("素数です\n"); else if(x==1)printf("素数ではありません\n"); else if(x%2==0)printf("素数ではありません\n"); else { for (i=3;i<=x;i++){ if(x==i){printf("素数です\n");break;} else if(x%i==0){printf("素数ではありません\n");break;} } }} return 0;} 素数判定のプログラムですけど、先生からは無駄が多いと言われました どこを直していけば無駄が少なくスマートなプログラムになります?
- 23 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 13:15:07 ]
- 基本は、nが与えられたら、2以上√n以下の数字割り切れるか調べること。
こんなもんだな flg=1; for( i=2; i*i < n; i++ ) if( n%i==0) { flg=0; break; } if(flg) printf("sosu"); else printf("not sosu");
- 24 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 13:17:42 ]
- >>22
・forループの中で調べるのは奇数だけで十分 ・forループ継続条件はi*i<=xで十分
- 25 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 13:24:36 ]
-
つ codepad.org/G74gjU64 #include<stdio.h> int primechk( int n){ int i; for( i=2; i*i <= n; i++ ) if( n%i==0) return 0; return 1; } int main() { int n; for(n=1; n<20; n++) if(primechk(n))printf("%dは素数です。\n",n); else printf("%dは素数ではありません。\n",n); }
- 26 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 13:28:57 ]
- 1は素数じゃねーよw
- 27 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 13:29:50 ]
- 1って素数だっけ
いやまぁどうでもいいけど
- 28 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 13:47:39 ]
-
codepad.org/5QB8HiAV #include<stdio.h> int primechk( int n){ int i; if(n==1) return 0; if(n==2) return 1; if(n%2==0) return 0; for( i=3; i*i <= n; i+=2 ) if( n%i==0) return 0; return 1; } int main() { int n; for(n=1; n<=20; n++) if(primechk(n))printf("%dは素数です。\n",n); else printf("%dは素数ではありません。\n",n); }
- 29 名前:22 mailto:sage [2010/02/01(月) 13:53:26 ]
- 確かに素数を調べるのに、for文の中は奇数だけで十分ですね
変数X/2でも十分なのも指摘されて気がつきました 引数の使い方がまだ少しあやふやなので関数は作らないようにしてたんですけど 関数を作った方が大分さっぱりとしたプログラムになりそうですね どうもありがとうございました
- 30 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 14:55:06 ]
- ソースコードにMSVC BCC GCCとか判別するマクロ組み込むやつあるけど
これはどこで調べられるんですか。 コンパイラが勝手に定義するんだろうけど。 一覧表とかありますか。
- 31 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 14:56:19 ]
- MSVCのときだけ、#include "stdafx.h"を有効にしたいんですが。
- 32 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 14:59:38 ]
- #ifdef _MSC_VER
#include "stdafx.h" #endif
- 33 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:11:31 ]
- >>32
VC2008でエラーが出ます。BCCだと平気です。 stdafx.hなしでコンパイルできる方法ないですか。 fatal error C1020: 予期しない #endif です。
- 34 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:13:24 ]
- _MSC_VER
__TURBOC__ __GNUC__ それぞれのコンパイラのマニュアルを参照するしかない そもそも stdafx.h 自体要らないのでは? プリコンパイルヘッダの設定を変えればいいと思う
- 35 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:14:09 ]
- 予測では、stdafx.hが何よりも速く読み込まれないとエラー出る仕組みになってると思います
- 36 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:14:49 ]
- 「プリコンパイルヘッダを使わない」という設定にすればいい
- 37 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:17:42 ]
-
プリコンパイル済みヘッダーを使用しない にしたら出来ました。サンクス
- 38 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:34:22 ]
- >>33
マジか 試さずに書いて申し訳なかったが、プリコンパイルヘッダへの アプローチはBCCの方が正しいと思う M$は何か変
- 39 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:53:49 ]
- M$のプリコンパイルヘッダは#include "stdafx.h"を特殊処理するので今時他と共存させるのなら使わない方が無難。
と書こうとしたら既に書かれていた件。
- 40 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 15:58:43 ]
- ビルドする前にクリーン(*.pchを削除)
をするのが最善 (プリコンパイルドヘッダも当然使う)
- 41 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 18:12:04 ]
- VCは前回のコンパイル途中結果をディスクに保存し再利用して
処理時間を加速する。この時ヘッダファイルが更新されることは 仮定していない。通常のファイルは更新してもおkだが ヘッダファイルを書き換えた場合は、途中結果をクリーン してビルドしないとおかしなことになることが多い。 VC周りのトラブルのかなりの部分を占める。
- 42 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 22:04:03 ]
- ( ´▽`) ♪
- 43 名前:デフォルトの名無しさん [2010/02/01(月) 22:28:39 ]
- GetHitKeyStateAll関数は、キー入力を常に監視しえいるのでしょうか?
あるキーが押されている時はAの処理で、 押されていない時はBの処理、としたいのですが、 if( Buf[ KEY_INPUT_Z ] == 1 ) {処理A} else {処理B} キーを押してAの処理は実行されるのですが、 キーを押すのを止めても、処理Bが実行されません。 独自に本などでC言語を勉強したので、 結構難しい問題も解けるようになったのですが、 実技?は全く駄目です。 よろしくお願いします。
- 44 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 22:32:16 ]
- >>43
GetHitKeyStateAll 関数が呼ばれた時点でのキーボード情報をどっかに保存するだけでしょ
- 45 名前:デフォルトの名無しさん [2010/02/01(月) 22:38:47 ]
- なるほどです。
とすると、常にあるキーの状態を監視しようとすると、 while文を使えばいいのでしょうか?
- 46 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 22:38:49 ]
- >>43
ループさせればいいじゃん
- 47 名前:43 [2010/02/01(月) 22:40:25 ]
- 皆さん、ありがとうございます。
やってみます。
- 48 名前:デフォルトの名無しさん [2010/02/01(月) 22:55:21 ]
- こんにちわ。それではさっそく質問です。
(変数定義割愛) for(i=0;i<10;i++) { a=x[i]*i; //"x"は数列だとします } まぁ、ざっとこのような"a"を作ったとして、 「もしすべての"a"が同じ値をとるなら」 というif文を作りたい場合、 if(???){ ←はどのように書けばいいでしょうか? 質問が雑だし初歩的ですみませんが、よろしくお願いします。
- 49 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 23:00:09 ]
-
int all_chk(int *a){ int b=a[0]; for(i=1;i<10;i++)if(b!=a[i])return 0; return 1; }
- 50 名前:デフォルトの名無しさん [2010/02/01(月) 23:02:45 ]
- 一見しただけじゃよくわかりませんが、
これを参考に勉強します。 大変ありがとうございました。
- 51 名前:推奨 mailto:sage [2010/02/01(月) 23:03:52 ]
- 効率は無視
後から読み返して理解出来ず書き直さないですませることを 前提とした書き方 int a[i],b; for(i=0;i<1000000;i++){ a[i]=x[i]*i; } b=1; for(i=1;i<100000;i++){ b=b &( (a[i-1]==a[i])?1: 0); } if(b!=0){ .....全部一致の場合 }else{ ....一部不一致のものがある場合 }
- 52 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 23:16:12 ]
- >>48
for(i=0; i<10; i++) if(x[i]) break; if(i==10)
- 53 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 23:43:59 ]
- >>48
i==0 のとき a==0 ∴x[0]は任意 かつ i!=0 のとき x[i]==0
- 54 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 23:45:09 ]
- >>52
for(a=0,i=0;i<10;++i)a+=x[i];return !a; i=0;do{if(!i<10)return true;}while(!x[i++]);return false;
- 55 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 23:47:46 ]
- >>52
for(i=1;i<10; i++)
- 56 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:52:54 ]
- 関数じたいをを配列みたいにすることって出来ますか
例えば void A[0]() { ............. } void A[1]() { ............. } void A[2]() { ............. } 呼び出すとき A[i](); こんな感じで
- 57 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:56:00 ]
- >>56
無理 呼び出す方かどこかで関数ポインタの配列を持って それで分岐するなら可能
- 58 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:19:04 ]
- >>57
ありがとうございます 解決できました
- 59 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:20:16 ]
- for文の条件式に配列を指定したんですけどうまくいきません
int a[10]の0番目の要素を見てfor文を回したいんですよ
- 60 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:21:14 ]
- な〜に〜
やっちまったな! 男は黙って↓
- 61 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:25:45 ]
- pascal
- 62 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:32:09 ]
- >>59
for(;ここに条件式を書きなさい;){}
- 63 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:41:20 ]
- >>62
int a[10]={0 , 10 ,10, 10, 10, 10, 10, 10, 10, 10}; for(a[10] ; a[10] <10 ; a[10]++) { } です。
- 64 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:42:04 ]
- 0番目の要素って言ってなかった?
- 65 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:52:36 ]
- >>64
そうでした。。。 ありがとうございます
- 66 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 05:35:42 ]
- 引数も戻り値もvoidの関数って
コンパイル時にdefineのように扱われるのかな
- 67 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 06:48:01 ]
- char str[10];
str = {"2","3","4"} っていれたあとは、str[3]〜[9]は空ですよね? これを削除してstr[3]に変えることってできますか?
- 68 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 06:49:23 ]
- ↑空の部分を削除してって意味です。
わかりづらくてすいません。
- 69 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 06:54:22 ]
- > っていれたあとは、
はいりません。 > str[3]〜[9]は空ですよね? 空の定義は?
- 70 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 09:25:10 ]
- 配列の初期状態は未定義か\x00か
- 71 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 10:43:32 ]
- たとえば3個の変数をそれぞれ独立に0〜9まで動かすときの全パターンである処理をするとき
for(int n1 = 0; n1 < 10; ++n1){ for(int n2 = 0; n2 < 10; ++n2){ for(int n3 = 0; n3 < 10; ++n3){ /* ある処理 */ } } } このように書くと,変数が10個100個と増えた場合階層が深くなりすぎて大変です。 変数の数が増えてもすぐ対応できるシンプルな記述方法はないでしょうか。
- 72 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 10:49:37 ]
- 再帰を使う。
- 73 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 11:08:38 ]
- >>71
#include <stdio.h> int *next(int *is, int size, int max) { int i; for (i = 0; i < size; ) { (*(is + i))++; if (max < *(is + i)) { (*(is + i)) = 0; i++; } else { return is; } } return 0; } int main() { int i, nums[3] = {0}, *p; for (p = nums; p; p = next(nums, 3, 9)) { printf("%d %d %d\n", nums[0], nums[1], nums[2]); } return 0; } 実装はヘボイが、狙いは見ての通り。 0からmaxまででint配列の要素を増やしていく。 あとは、その配列を使う。
- 74 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 11:09:23 ]
- >>72
頭が固くてぱっとは見えませんが調べる方向はわかりました。 どうもありがとうございます。
- 75 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 11:13:45 ]
- >>73
おおありがとうございます><
- 76 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 11:14:45 ]
- for(n1=n2=n3=0;n1<n1Max;++n3,n2+=(n3>n3Max?(n3=0,1):0),n1+=(n2>n2Max?(n2=0,1):0))
/*any処理*/;
- 77 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 11:18:10 ]
- 常に { } で括らなくちゃいけないわけではないので
for(int n1 = 0; n1 < 10; ++n1) for(int n2 = 0; n2 < 10; ++n2) for(int n3 = 0; n3 < 10; ++n3) { /* ある処理 */ } とすれば深くならないぞ for文を10個も100個も並べる面倒さは変わらないが・・・
- 78 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 11:21:00 ]
- 再帰って限界あるよね?
俺の記述がバグってただけかもしれないが、 八回までは正常に再帰してくれるけど、 九回からはおかしくなる、九回目の呼び出しがされなかった覚えが。 八回目までで勝手に引き返してきた覚えが。
- 79 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 11:23:16 ]
- >>78
よっぽどスタックが浅いのか、あるいは局所変数がデカいのか。
- 80 名前:デフォルトの名無しさん [2010/02/02(火) 11:54:57 ]
- >>78
それは本当に再帰の限界だったのか? 再帰に限ったことではなくループや順次でも n 回目からおかしいといバグは出るが それだけでループが n 回までに制限されているという結論は出せないだろ
- 81 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 12:23:59 ]
- >71
10個100個になるのは異常 深くならないように工夫する >72 ふ〜ん、考えてみるか >73 大域変数とプロシジャでも使うのか >76 100個になったときを想像したら
- 82 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 12:50:57 ]
- >>73
さらっと書いてあったので簡単かと思いきや nextの動きを理解するのにめちゃ時間かかってしまったw 日常的に使われるテクニックなんでしょうか。 >>77 数個程度のオーダーなら一番読みやすいですね。 どうもありがとうございます。 再帰についてはこれから調べてみます。
- 83 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 12:54:10 ]
- >>81
> 100個になったときを想像したら プログラムで生成すればいい。コンパイラリミットとの戦いになるけど。w
- 84 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 13:02:35 ]
- >>71
for(i=0; i<pow(10,n); i++) { n0 = i % 10; n1 = (i / 10) % 10; n2 = (i / 100) % 10; ....
- 85 名前:73 mailto:sage [2010/02/02(火) 13:25:38 ]
- >>82
日常的に使われるかどうかは分かりません。 必要に迫られてひねり出した苦肉の策です。 もとは、再帰でやっていたのですが、 再帰が深くなりすぎると失敗するみたいなので、 配列を使うことした、ということです。
- 86 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 14:30:19 ]
- そもそもからして
int x[100]; for(x[0]=0;x[0]<3;x[0]++) for(x[1]=0;x[1]<3;x[1]++) for(x[2]=0;x[2]<3;x[2]++) ..... for(x[99]=0;x[99]<3;x[99]++) .... これが現在最速のPCですら、まともな時間で動作する ような計算量ではない件
- 87 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 14:36:36 ]
- 3の100乗回か
- 88 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:36:45 ]
- #include<stdio.h>
#define MAX 3 int num[MAX] = {0, 1, 2 となってるときに2をしてするなら num[3] だと思うのですがMAXを使って2を指定するには どうすればいいですか
- 89 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:39:22 ]
- num[3]は2じゃないぞ
- 90 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:42:03 ]
- >>73
なるほどキモイね イイ意味で
- 91 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:42:03 ]
- MAXが3だから
num[MAX-1]にすれば、2を取り出すことは出来る
- 92 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:43:13 ]
- > となってるときに2をしてするなら
> num[3] うんにゃ 戻りが2を指す場所は num[2] だ。 (配列の添え字は 0 から始まるので) int hoge[] = { 5, 4, 3 }; hoge[0] → 5 hoge[1] → 4 hoge[2] → 3 な > だと思うのですがMAXを使って2を指定するには > どうすればいいですか num[MAX-1] とでも書く int foo[MAX] と MAX個の器を用意した場合には 0〜MAX-1 で参照するんだぜー
- 93 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:48:51 ]
- char str[10];
str = {"234"} っていれたあとは、str[3]〜[9]は何もはいってないですよね? このはいってない部分を削除することできる? 容量を小さくしたいんですが、strに入れる文字列の長さが毎回違うので。
- 94 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:50:05 ]
- 静的確保してるから無理
- 95 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:50:24 ]
- mallocについて調べると蝶最高な気分になれるぞ
- 96 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:52:44 ]
- 多少スレ違い気味で質問
str = {"234"} この代入が可能なのは C99 から?
- 97 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:53:33 ]
- amountという単語が有ってだな容量を表したりするんだ
maximumがゼロからカウントするかどうかに関わらず容量と
- 98 名前:88 mailto:sage [2010/02/02(火) 17:55:41 ]
- num[MAX-1]
で動きました。ありがとうございます
- 99 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:00:44 ]
- プログラムの設定ファイルの、読み込めなかった場合のデフォルトの値ってプログラムに埋め込んじゃうの?
- 100 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:01:27 ]
- >>99
yes
- 101 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:03:25 ]
- >>93
>何もはいってないですよね? いや、何だかわからない値が入っている。
- 102 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:06:59 ]
- >>101
str[3] は '\0' 固定じゃね?
- 103 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:09:38 ]
- 何が入るかは場所にもよるけどな。
しかし毎回変わるというのがグローバルっぽくないのだが、 容量を小さくしたい、というからにはグローバルなんだろうか。
- 104 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:11:19 ]
- >101
記憶クラスによる
- 105 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:12:53 ]
- malloc使って動的に確保すれば
char str[3][10]; str[0][10]〜str[2][10]に入れる文字列の長さが違ってもサイズ無駄なく格納できますか?
- 106 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:14:09 ]
- >>105
すきまができますね。
- 107 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:16:25 ]
- >malloc使って動的に確保すれば
から >char str[3][10]; の類推の段階で、無駄なくつめることができていない char* str[3] ならそう記述する可能性は高まるけど… ポインタと配列に関することは大丈夫か? と不安になる返答だね
- 108 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:18:02 ]
- >>96
オレも気になる
- 109 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:52:07 ]
- 試してみた
1^Inbsp;^Inbsp;int 2^Inbsp;^Inbsp;foo(void) 3^Inbsp;^Inbsp;{ 4^Inbsp;^Inbsp;^Inbsp;^Inbsp;char *foo; 5^Inbsp;^Inbsp;^Inbsp;^Inbsp;char bar[10]; 6^Inbsp;^Inbsp; 7^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo = (char []){"abc"}; 8^Inbsp;^Inbsp;^Inbsp;^Inbsp;// 下と同じ 9^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = (char []){'a', 'b', 'c', '\000'}; 10^Inbsp;^Inbsp; 11^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = {"abc"}; 12^Inbsp;^Inbsp;^Inbsp;^Inbsp;// error : 左ブレースが異常 13^Inbsp;^Inbsp; 14^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo[0] = 'q'; 15^Inbsp;^Inbsp;^Inbsp;^Inbsp;// ok : 書き換え可能 16^Inbsp;^Inbsp; 17^Inbsp;^Inbsp;^Inbsp;^Inbsp;foo = (char *){"abc"}; 18^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = "abc"; と似たようなもの 19^Inbsp;^Inbsp; 20^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo = (char *){'a', 'b', 'c', '\000'}; 21^Inbsp;^Inbsp;^Inbsp;^Inbsp;// warning : 初期化子が多い 22^Inbsp;^Inbsp; 23^Inbsp;^Inbsp;^Inbsp;^Inbsp;// foo[0] = 'q'; 24^Inbsp;^Inbsp;^Inbsp;^Inbsp;// maybe : foo : char const * 25^Inbsp;^Inbsp; 26^Inbsp;^Inbsp;^Inbsp;^Inbsp;// bar = (char []){"abc"}; 27^Inbsp;^Inbsp;^Inbsp;^Inbsp;// error : bar : char * const 28^Inbsp;^Inbsp;^Inbsp;^Inbsp;(void)bar; 29^Inbsp;^Inbsp; 30^Inbsp;^Inbsp;^Inbsp;^Inbsp;return 0; 31^Inbsp;^Inbsp;}
- 110 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:53:44 ]
- >109 おっと、正規表現で&をエスケープしてなかった>110
1 int 2 foo(void) 3 { 4 char *foo; 5 char bar[10]; 6 7 foo = (char []){"abc"}; 8 // 下と同じ 9 // foo = (char []){'a', 'b', 'c', '\000'}; 10 11 // foo = {"abc"}; 12 // error : 左ブレースが異常 13 14 foo[0] = 'q'; 15 // ok : 書き換え可能 16 17 foo = (char *){"abc"}; 18 // foo = "abc"; と似たようなもの 19 20 // foo = (char *){'a', 'b', 'c', '\000'}; 21 // warning : 初期化子が多い 22 23 // foo[0] = 'q'; 24 // maybe : foo : char const * 25 26 // bar = (char []){"abc"}; 27 // error : bar : char * const 28 (void)bar; 29 30 return 0; 31 }
- 111 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:56:58 ]
- インデントは専ブラにやらせるのが楽
- 112 名前:デフォルトの名無しさん [2010/02/02(火) 23:17:10 ]
- codepad
ttp://codepad.org/ 長いソースを貼るときはここへ! ってテンプレートに入れようぜ。
- 113 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 23:38:54 ]
- お前が立てるときに足せばいいじゃないか
- 114 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 23:50:30 ]
- >>109
検証下手だなぁ
- 115 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:34:09 ]
- 配列 int out[3]={1,5,3};
の配列の各要素の大小関係を比べるプログラムをfor文で作りたんですけど どうすればいいですか?
- 116 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:36:39 ]
- 宿題は宿題スレへ
- 117 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:37:09 ]
- >>115
バブルソートでググればおk
- 118 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 00:41:28 ]
- >>116
わかりました。 宿題スレに行きます
- 119 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 11:56:08 ]
- 最近気づいたんだが、固定幅フォントより非固定幅のほうが目に優しいわ
- 120 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 12:31:20 ]
- >>119
これ? プログラミングはプロポーショナルフォントの方が読みやすい ? slashdot.jp/developers/article.pl?sid=10/01/20/025204
- 121 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:21:11 ]
- #defineで定義されたマクロの有効範囲は#undefされない限り翻訳単位内のみとのことですが
#define HOO foo という定義を含むファイルをincludeした場合 includeした側にもこのマクロが適用されると言うことでしょうか
- 122 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:23:36 ]
- >>121
yes そうでないと インクルードガードが効かなくなっちゃう
- 123 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:24:03 ]
- そうだよ
意識しなくても標準ライブラリで#defineされたものを普通に使ってると思うけど
- 124 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:27:41 ]
- 逆にファイル外に伝播して欲しくない場合はundefで明示しないといけないと言うことですね
ありがとうございました
- 125 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:16:34 ]
- 二つの文字列を連結させるプログラムを書いたんですが
以下のままでは文字列終端のNULL処理がされていないと言われました mojiC[100]の中身を初期化した時点でNULL処理できている気がするんですが #include<stdio.h> int main(void) { /* 連結した文字列を格納するのに十分な長さの配列 */ char mojiC[100] ; /* 連結元の文字列 */ char mojiB[] = "World" ; char mojiA[] = "Hello" ; /* 連結を行うプログラム */ int i, j; for(i=0;i<100;i++){ //mojiC[100]の中身を初期化 mojiC[i]=0; } for(i=0;mojiA[i]!=0;i++){ //mojiC[100]にmojiA[]の中身をコピー mojiC[i]=mojiA[i]; } for(i=0,j=0;mojiC[i]!=0;i++,j++){ } for(i=0;mojiB[i]!=0;i++,j++){ //mojiC[100]にmojiB[]の中身をコピー mojiC[j]=mojiB[i]; } printf("%s\n", mojiC) ; /* HelloWorld と表示 */ return(0) ; }
- 126 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:19:35 ]
- 100+300では駄目だろ 100個しかしてないからな
- 127 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:22:27 ]
- memcpyつかった方が転送効率良いよ。
どんな長さでも動くようにするには、動的確保。 あと初期化する必要なし、手間がかかる。 動的確保 -> memcpyでデータ配置 -> 最後にNULL付加でよし
- 128 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:24:54 ]
- >>125
>文字列終端のNULL処理 NULL じゃねえ、'\0' 或いは NUL。 てのは置いといて、 >できている気がするんですが できてる。 無駄は多いけどな。 (2つ目のループは j = i; とすれば要らないだろ、とか)
- 129 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:26:39 ]
- NULLってのとナル文字(ヌル文字?)の区別を学ぼう。
char c = '\0'がそれ。 あと、char mojiC[100] = {'\0'};こういうことをしておけば、 「mojiC[100]の中身を初期化」の部分は不要。 ただ、普通は配列を初期化なんぞしないで、 文字列をコピーした最後に'\0'をくっつけるのフツー。
- 130 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:27:34 ]
-
こんなふうだ。 mojiwa(char *p, char *a ,char *b,){ int m=strlen(a); int n=strlen(b); char *p = (char *)malloc(m+n); memcpy(&p[0],a,m); memcpy(&p[m],b,n); p[m+n]=NULL;; }
- 131 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:27:49 ]
- かぶった。>>129は>>125宛て。
- 132 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:32:38 ]
- >>127
>memcpyつかった方が転送効率良いよ。 それ言うなら strcat 使え、って話に… まあ習作なんだろうから、自分でコピーしてみるのはアリかも知れん。
- 133 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:34:06 ]
- >>132
ですよねー
- 134 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:36:45 ]
- >130
やべぇ、何やってんのかさっぱりわからん
- 135 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:37:00 ]
- 勉強のためなんだろうから、あえて使ってないんだろう。
最初にj=0にしておけば、mojiCへの代入はすべて mojiC[j++]= とやれば途中のj++の部分は全部消せる。 最後にmojiC[j++]='\0';とかいれとけ
- 136 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:43:51 ]
- strlen memcpyという関数を自作すれば見通し良い。
- 137 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 18:14:08 ]
- 同一名称、あるいは酷似した名称を使うのは
車輪の再発明で悦に入る行為かもな 内容は同じなライブリ関数を自作して使用するの は悪いこととは限らないといった程度
- 138 名前:やってみた mailto:sage [2010/02/03(水) 18:16:48 ]
- void *
memcopy(void *d1, const void *s1, size_t sz) { char *d2 = d1; const char *s2 = s1; while (sz-- > 0) *d2++ = *s2++; return d1; }
- 139 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 19:02:08 ]
- int m=strlen(a); // 超違和感
- 140 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 19:03:45 ]
- 何故sprintf()を使わないのか?無意味な苦労はバグを生むだけ。
- 141 名前:デフォルトの名無しさん [2010/02/03(水) 19:18:46 ]
- 無意味な苦労でも、車輪の再発明でも、実装を知っていることは良いことだ。
日本のイット業界なんかアルゴリズム詳しく知らなくても仕事できちゃうもん。 あはは。
- 142 名前:推奨 mailto:sage [2010/02/03(水) 19:51:46 ]
- 実装など実務経験の間に自然に知って欲しかった
というのはあるかも知れないが いつの時代でもコンスタントにそれが 出来るとは限らない とりわけ露出狂時代にはね。
- 143 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 22:53:58 ]
- >>141
だって、技術者じゃなくドカタだもん
- 144 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 23:07:14 ]
- アルゴリズムってなに?
- 145 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 23:08:48 ]
- >>144
Wikipedia読んで、それでもわからなかったら、丸一日考えて、 それでもわからなかったら、何がわからないのか質問しなさい。
- 146 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 09:22:26 ]
- >>144
いーっぽすすんでまえならえ〜♪
- 147 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 10:37:05 ]
- コンパイル環境のエンディアンを調べるれるようなマクロとかってある?
それか明示的にエンディアン指定できるpragmaとかあればいいんだけど
- 148 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 11:23:22 ]
- こういうのか
ttp://www5d.biglobe.ne.jp/~noocyte/Programming/CMacros.html#DetermineEndian
- 149 名前:デフォルトの名無しさん [2010/02/04(木) 15:43:38 ]
- #include <stdio.h>
/* 整数の2進表現を下位から表示 */ int main(void) { int n, b; n = 0; do { b = n % 2; printf("%d\n", b); n /= 2; } while (n > 0); return 0; } このプログラムをn=0にしたときに同じ結果を得るにはどうしたらいいのですか?
- 150 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 15:46:26 ]
- if(n==0)で0の時だけ処理分ける
- 151 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 15:48:50 ]
- >>149
何と同じにするのか分からん
- 152 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 15:58:59 ]
- >>149
2進数はビット演算子を使うのが常套手段じゃないのかな? int n; n = 15; do { printf("%d\n", n & 1); } while ((n >>= 1) > 0);
- 153 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:03:20 ]
- >>152 n進数への応用がきかない。
- 154 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:14:42 ]
- #include <stdio.h>
int main() { int n = 7, i; for (i = 0; i < sizeof n * 8; i++) { printf("%d\n", !!(n & (1 << i))); } return 0; }
- 155 名前:デフォルトの名無しさん mailto:sage [2010/02/04(木) 16:35:11 ]
- そもそも>>151の言うように、どういう出力を期待してるのか
質問者は書いてみてくれないか
|

|