C言語なら俺に聞け(入門編)Part 60at TECH
C言語なら俺に聞け(入門編)Part 60 - 暇つぶし2ch2:デフォルトの名無しさん
10/01/31 16:06:22
signed char s = 'ア';

とすると、マイナスの値になりますが、マイナスの値になると何か支障がでるのでしょうか?

下記サイトに、

>ASCIIコードと1バイトのJISコードだけが使用可能です。
>それでもJISコードを使用するときは、unsigned char型である必要があります。
>それは半角カタカナ等が(161~223)に定義されているためです。

URLリンク(c-production.com)

と書かれています。
最上位バイトが立つ文字を扱うときは、unsigned charにしなければならないのでしょうか?

3:デフォルトの名無しさん
10/01/31 16:12:35
C/C++コード中のキャラクタセットの扱いなんてバッドノウハウの詰め合わせみたいなもんだから
正解は無いよ

4:デフォルトの名無しさん
10/01/31 16:13:46
>>2
そもそも半角カナ使うこと自体が間違ってる..


とか言ったらこのスレッドでは叩かれちゃう?

5:デフォルトの名無しさん
10/01/31 16:26:51
>>2
符号拡張されるから

6:デフォルトの名無しさん
10/01/31 16:43:05
>4
ヨーロッパ言語のアクセント付き文字だってカタカナと変わらん。
ñ á é í ó ú ü ç
œ é è à î ô û ï


7:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/01/31 17:48:40
ポインタを進めている

9:デフォルトの名無しさん
10/01/31 17:54:30
>printf(" %7.2f", *a_p); a_p++;
この部分、
printf(" %7.2f", a_p[i * ncol + j]);
と同じ

10:デフォルトの名無しさん
10/01/31 18:09:46
>>6
半角カナはchar1個分なのにマイナスってことじゃないの?
よくわからんけど

11:デフォルトの名無しさん
10/01/31 19:39:57
#include <stdio.h>
int main() {
if ('ア' > 0)
printf("plus.\n");
else
printf("minus.\n");
return 0;
}
を実行すると、
minus.
になった。半角カナは負数扱いらしい。

12:デフォルトの名無しさん
10/01/31 19:52:29
そうなったのは、そのソースファイルが SJIS になってるからでは?

13:デフォルトの名無しさん
10/01/31 19:59:34
>>7です
a_p++;
がなくてもfor文があるからいいわけではないんですか?

14:デフォルトの名無しさん
10/01/31 20:05:47
いいけど、a_p は ++ されないよ

15:デフォルトの名無しさん
10/01/31 20:08:34
32Bitマシンと64Bitマシンって何が違うんですか?
コンパイラは違いを吸収してくれますか?

16:デフォルトの名無しさん
10/01/31 20:28:48
32ビットマシンの場合はint, long, pointerが全部32ビットなので、それら
の区別をあいまいなまま使用しても動いてしまった。
64ビットマシンの処理系はint 32ビット、longとpointerが64ビットのデータモデル
を使っている場合が多い。書き換えが必要になる場合がある。

17:デフォルトの名無しさん
10/01/31 20:29:32
>>11
試しにif内の0をunsigned intでキャストして実行してみろ

18:デフォルトの名無しさん
10/01/31 20:51:51
>>16
ポインタサイズがちがうということは32BitでビルどしたDLLを64Bitで使うとかすると死ぬわけですね
㌧でした

19:デフォルトの名無しさん
10/01/31 21:01:17
いつもgccでmakeしてるプログラムが有るんだけどVisual C++で同じようにコンパイルできる?
とりあえずVisualStudioインストールして少しいじってみたけど分からない

20:デフォルトの名無しさん
10/01/31 21:04:10
makeの形式が違うだろ 
自動変換できる風呂グラムでもあれば出来るが

21:デフォルトの名無しさん
10/01/31 21:22:13
>>18
64ビットプロセスから32bit dllはロード出来ないから安心しろ。
そこいら辺はOSがよきにはからってくれる。

22:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/01 13:17:42
>>22
・forループの中で調べるのは奇数だけで十分
・forループ継続条件はi*i<=xで十分

25:デフォルトの名無しさん
10/02/01 13:24:36



URLリンク(codepad.org)

#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:デフォルトの名無しさん
10/02/01 13:28:57
1は素数じゃねーよw

27:デフォルトの名無しさん
10/02/01 13:29:50
1って素数だっけ
いやまぁどうでもいいけど

28:デフォルトの名無しさん
10/02/01 13:47:39

URLリンク(codepad.org)

#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
10/02/01 13:53:26
確かに素数を調べるのに、for文の中は奇数だけで十分ですね
変数X/2でも十分なのも指摘されて気がつきました

引数の使い方がまだ少しあやふやなので関数は作らないようにしてたんですけど
関数を作った方が大分さっぱりとしたプログラムになりそうですね
どうもありがとうございました

30:デフォルトの名無しさん
10/02/01 14:55:06
ソースコードにMSVC BCC GCCとか判別するマクロ組み込むやつあるけど
これはどこで調べられるんですか。
コンパイラが勝手に定義するんだろうけど。
一覧表とかありますか。

31:デフォルトの名無しさん
10/02/01 14:56:19
MSVCのときだけ、#include "stdafx.h"を有効にしたいんですが。

32:デフォルトの名無しさん
10/02/01 14:59:38
#ifdef _MSC_VER
#include "stdafx.h"
#endif

33:デフォルトの名無しさん
10/02/01 15:11:31
>>32
VC2008でエラーが出ます。BCCだと平気です。
stdafx.hなしでコンパイルできる方法ないですか。


fatal error C1020: 予期しない #endif です。

34:デフォルトの名無しさん
10/02/01 15:13:24
_MSC_VER
__TURBOC__
__GNUC__
それぞれのコンパイラのマニュアルを参照するしかない

そもそも stdafx.h 自体要らないのでは?
プリコンパイルヘッダの設定を変えればいいと思う

35:デフォルトの名無しさん
10/02/01 15:14:09
予測では、stdafx.hが何よりも速く読み込まれないとエラー出る仕組みになってると思います

36:デフォルトの名無しさん
10/02/01 15:14:49
「プリコンパイルヘッダを使わない」という設定にすればいい

37:デフォルトの名無しさん
10/02/01 15:17:42

プリコンパイル済みヘッダーを使用しない

にしたら出来ました。サンクス

38:デフォルトの名無しさん
10/02/01 15:34:22
>>33
マジか
試さずに書いて申し訳なかったが、プリコンパイルヘッダへの
アプローチはBCCの方が正しいと思う

M$は何か変

39:デフォルトの名無しさん
10/02/01 15:53:49
M$のプリコンパイルヘッダは#include "stdafx.h"を特殊処理するので今時他と共存させるのなら使わない方が無難。
と書こうとしたら既に書かれていた件。

40:デフォルトの名無しさん
10/02/01 15:58:43
ビルドする前にクリーン(*.pchを削除)
をするのが最善
(プリコンパイルドヘッダも当然使う)

41:デフォルトの名無しさん
10/02/01 18:12:04
VCは前回のコンパイル途中結果をディスクに保存し再利用して
処理時間を加速する。この時ヘッダファイルが更新されることは
仮定していない。通常のファイルは更新してもおkだが
ヘッダファイルを書き換えた場合は、途中結果をクリーン
してビルドしないとおかしなことになることが多い。
VC周りのトラブルのかなりの部分を占める。

42:デフォルトの名無しさん
10/02/01 22:04:03
( ´▽`) ♪

43:デフォルトの名無しさん
10/02/01 22:28:39
GetHitKeyStateAll関数は、キー入力を常に監視しえいるのでしょうか?
あるキーが押されている時はAの処理で、
押されていない時はBの処理、としたいのですが、

if( Buf[ KEY_INPUT_Z ] == 1 )
{処理A}
else
{処理B}

キーを押してAの処理は実行されるのですが、
キーを押すのを止めても、処理Bが実行されません。

独自に本などでC言語を勉強したので、
結構難しい問題も解けるようになったのですが、
実技?は全く駄目です。
よろしくお願いします。

44:デフォルトの名無しさん
10/02/01 22:32:16
>>43
GetHitKeyStateAll 関数が呼ばれた時点でのキーボード情報をどっかに保存するだけでしょ

45:デフォルトの名無しさん
10/02/01 22:38:47
なるほどです。
とすると、常にあるキーの状態を監視しようとすると、
while文を使えばいいのでしょうか?


46:デフォルトの名無しさん
10/02/01 22:38:49
>>43
ループさせればいいじゃん

47:43
10/02/01 22:40:25
皆さん、ありがとうございます。
やってみます。

48:デフォルトの名無しさん
10/02/01 22:55:21
こんにちわ。それではさっそく質問です。
(変数定義割愛)
for(i=0;i<10;i++)
{
a=x[i]*i; //"x"は数列だとします
}

まぁ、ざっとこのような"a"を作ったとして、
「もしすべての"a"が同じ値をとるなら」
というif文を作りたい場合、
if(???){ ←はどのように書けばいいでしょうか?

質問が雑だし初歩的ですみませんが、よろしくお願いします。



49:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/01 23:02:45
一見しただけじゃよくわかりませんが、
これを参考に勉強します。

大変ありがとうございました。

51:推奨
10/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:デフォルトの名無しさん
10/02/01 23:16:12
>>48
for(i=0; i<10; i++) if(x[i]) break;
if(i==10)

53:デフォルトの名無しさん
10/02/01 23:43:59
>>48
i==0 のとき a==0
∴x[0]は任意 かつ i!=0 のとき x[i]==0

54:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/01 23:47:46
>>52
for(i=1;i<10; i++)

56:デフォルトの名無しさん
10/02/02 00:52:54
関数じたいをを配列みたいにすることって出来ますか

例えば
void A[0]()
{
.............
}

void A[1]()
{
.............
}

void A[2]()
{
.............

}

呼び出すとき
A[i]();

こんな感じで


57:デフォルトの名無しさん
10/02/02 00:56:00
>>56
無理
呼び出す方かどこかで関数ポインタの配列を持って
それで分岐するなら可能

58:デフォルトの名無しさん
10/02/02 01:19:04
>>57
ありがとうございます
解決できました

59:デフォルトの名無しさん
10/02/02 01:20:16
for文の条件式に配列を指定したんですけどうまくいきません
int a[10]の0番目の要素を見てfor文を回したいんですよ

60:デフォルトの名無しさん
10/02/02 01:21:14
な~に~
やっちまったな!
男は黙って↓

61:デフォルトの名無しさん
10/02/02 01:25:45
pascal

62:デフォルトの名無しさん
10/02/02 01:32:09
>>59
for(;ここに条件式を書きなさい;){}

63:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/02 01:42:04
0番目の要素って言ってなかった?

65:デフォルトの名無しさん
10/02/02 01:52:36
>>64
そうでした。。。
ありがとうございます

66:デフォルトの名無しさん
10/02/02 05:35:42
引数も戻り値もvoidの関数って
コンパイル時にdefineのように扱われるのかな

67:デフォルトの名無しさん
10/02/02 06:48:01
char str[10];
str = {"2","3","4"}

っていれたあとは、str[3]~[9]は空ですよね?
これを削除してstr[3]に変えることってできますか?


68:デフォルトの名無しさん
10/02/02 06:49:23
↑空の部分を削除してって意味です。
わかりづらくてすいません。

69:デフォルトの名無しさん
10/02/02 06:54:22
> っていれたあとは、
はいりません。
> str[3]~[9]は空ですよね?
空の定義は?



70:デフォルトの名無しさん
10/02/02 09:25:10
配列の初期状態は未定義か\x00か

71:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/02 10:49:37
再帰を使う。

73:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/02 11:09:23
>>72
頭が固くてぱっとは見えませんが調べる方向はわかりました。
どうもありがとうございます。

75:デフォルトの名無しさん
10/02/02 11:13:45
>>73
おおありがとうございます><

76:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/02 11:21:00
再帰って限界あるよね?
俺の記述がバグってただけかもしれないが、
八回までは正常に再帰してくれるけど、
九回からはおかしくなる、九回目の呼び出しがされなかった覚えが。
八回目までで勝手に引き返してきた覚えが。

79:デフォルトの名無しさん
10/02/02 11:23:16
>>78
よっぽどスタックが浅いのか、あるいは局所変数がデカいのか。

80:デフォルトの名無しさん
10/02/02 11:54:57
>>78
それは本当に再帰の限界だったのか?
再帰に限ったことではなくループや順次でも n 回目からおかしいといバグは出るが
それだけでループが n 回までに制限されているという結論は出せないだろ

81:デフォルトの名無しさん
10/02/02 12:23:59
>71
10個100個になるのは異常
深くならないように工夫する

>72
ふ~ん、考えてみるか

>73
大域変数とプロシジャでも使うのか

>76
100個になったときを想像したら

82:デフォルトの名無しさん
10/02/02 12:50:57
>>73
さらっと書いてあったので簡単かと思いきや
nextの動きを理解するのにめちゃ時間かかってしまったw
日常的に使われるテクニックなんでしょうか。

>>77
数個程度のオーダーなら一番読みやすいですね。
どうもありがとうございます。

再帰についてはこれから調べてみます。

83:デフォルトの名無しさん
10/02/02 12:54:10
>>81
> 100個になったときを想像したら
プログラムで生成すればいい。コンパイラリミットとの戦いになるけど。w

84:デフォルトの名無しさん
10/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
10/02/02 13:25:38
>>82
日常的に使われるかどうかは分かりません。
必要に迫られてひねり出した苦肉の策です。
もとは、再帰でやっていたのですが、
再帰が深くなりすぎると失敗するみたいなので、
配列を使うことした、ということです。

86:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/02 14:36:36
3の100乗回か

88:デフォルトの名無しさん
10/02/02 17:36:45
#include<stdio.h>
#define MAX 3

int num[MAX] = {0, 1, 2

となってるときに2をしてするなら

num[3]

だと思うのですがMAXを使って2を指定するには
どうすればいいですか

89:デフォルトの名無しさん
10/02/02 17:39:22
num[3]は2じゃないぞ

90:デフォルトの名無しさん
10/02/02 17:42:03
>>73
なるほどキモイね
イイ意味で

91:デフォルトの名無しさん
10/02/02 17:42:03
MAXが3だから
num[MAX-1]にすれば、2を取り出すことは出来る

92:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/02 17:48:51
char str[10];
str = {"234"}

っていれたあとは、str[3]~[9]は何もはいってないですよね?
このはいってない部分を削除することできる?
容量を小さくしたいんですが、strに入れる文字列の長さが毎回違うので。

94:デフォルトの名無しさん
10/02/02 17:50:05
静的確保してるから無理

95:デフォルトの名無しさん
10/02/02 17:50:24
mallocについて調べると蝶最高な気分になれるぞ

96:デフォルトの名無しさん
10/02/02 17:52:44
多少スレ違い気味で質問
str = {"234"}

この代入が可能なのは C99 から?

97:デフォルトの名無しさん
10/02/02 17:53:33
amountという単語が有ってだな容量を表したりするんだ
maximumがゼロからカウントするかどうかに関わらず容量と

98:88
10/02/02 17:55:41
num[MAX-1]
で動きました。ありがとうございます



99:デフォルトの名無しさん
10/02/02 18:00:44
プログラムの設定ファイルの、読み込めなかった場合のデフォルトの値ってプログラムに埋め込んじゃうの?

100:デフォルトの名無しさん
10/02/02 18:01:27
>>99
yes

101:デフォルトの名無しさん
10/02/02 18:03:25
>>93
>何もはいってないですよね?
いや、何だかわからない値が入っている。

102:デフォルトの名無しさん
10/02/02 18:06:59
>>101
str[3] は '\0' 固定じゃね?

103:デフォルトの名無しさん
10/02/02 18:09:38
何が入るかは場所にもよるけどな。
しかし毎回変わるというのがグローバルっぽくないのだが、
容量を小さくしたい、というからにはグローバルなんだろうか。

104:デフォルトの名無しさん
10/02/02 18:11:19
>101
記憶クラスによる

105:デフォルトの名無しさん
10/02/02 18:12:53
malloc使って動的に確保すれば
char str[3][10];

str[0][10]~str[2][10]に入れる文字列の長さが違ってもサイズ無駄なく格納できますか?

106:デフォルトの名無しさん
10/02/02 18:14:09
>>105
すきまができますね。

107:デフォルトの名無しさん
10/02/02 18:16:25
>malloc使って動的に確保すれば

から

>char str[3][10];

の類推の段階で、無駄なくつめることができていない

char* str[3]

ならそう記述する可能性は高まるけど…
ポインタと配列に関することは大丈夫か? と不安になる返答だね

108:デフォルトの名無しさん
10/02/02 18:18:02
>>96
オレも気になる

109:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/02 18:56:58
インデントは専ブラにやらせるのが楽

112:デフォルトの名無しさん
10/02/02 23:17:10
 codepad
 URLリンク(codepad.org)

長いソースを貼るときはここへ!


ってテンプレートに入れようぜ。

113:デフォルトの名無しさん
10/02/02 23:38:54
お前が立てるときに足せばいいじゃないか

114:デフォルトの名無しさん
10/02/02 23:50:30
>>109
検証下手だなぁ

115:デフォルトの名無しさん
10/02/03 00:34:09
配列 int out[3]={1,5,3};
の配列の各要素の大小関係を比べるプログラムをfor文で作りたんですけど
どうすればいいですか?

116:デフォルトの名無しさん
10/02/03 00:36:39
宿題は宿題スレへ

117:デフォルトの名無しさん
10/02/03 00:37:09
>>115
バブルソートでググればおk

118:デフォルトの名無しさん
10/02/03 00:41:28
>>116
わかりました。
宿題スレに行きます

119:デフォルトの名無しさん
10/02/03 11:56:08
最近気づいたんだが、固定幅フォントより非固定幅のほうが目に優しいわ

120:デフォルトの名無しさん
10/02/03 12:31:20
>>119
これ?

プログラミングはプロポーショナルフォントの方が読みやすい ?
URLリンク(slashdot.jp)

121:デフォルトの名無しさん
10/02/03 14:21:11
#defineで定義されたマクロの有効範囲は#undefされない限り翻訳単位内のみとのことですが
#define HOO foo という定義を含むファイルをincludeした場合
includeした側にもこのマクロが適用されると言うことでしょうか

122:デフォルトの名無しさん
10/02/03 14:23:36
>>121
yes

そうでないと インクルードガードが効かなくなっちゃう

123:デフォルトの名無しさん
10/02/03 14:24:03
そうだよ
意識しなくても標準ライブラリで#defineされたものを普通に使ってると思うけど

124:デフォルトの名無しさん
10/02/03 14:27:41
逆にファイル外に伝播して欲しくない場合はundefで明示しないといけないと言うことですね

ありがとうございました

125:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/03 17:19:35
100+300では駄目だろ 100個しかしてないからな

127:デフォルトの名無しさん
10/02/03 17:22:27
memcpyつかった方が転送効率良いよ。
どんな長さでも動くようにするには、動的確保。
あと初期化する必要なし、手間がかかる。
動的確保 -> memcpyでデータ配置  -> 最後にNULL付加でよし

128:デフォルトの名無しさん
10/02/03 17:24:54
>>125
>文字列終端のNULL処理
NULL じゃねえ、'\0' 或いは NUL。
てのは置いといて、
>できている気がするんですが
できてる。

無駄は多いけどな。
(2つ目のループは j = i; とすれば要らないだろ、とか)

129:デフォルトの名無しさん
10/02/03 17:26:39
NULLってのとナル文字(ヌル文字?)の区別を学ぼう。
char c = '\0'がそれ。

あと、char mojiC[100] = {'\0'};こういうことをしておけば、
「mojiC[100]の中身を初期化」の部分は不要。

ただ、普通は配列を初期化なんぞしないで、
文字列をコピーした最後に'\0'をくっつけるのフツー。

130:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/03 17:27:49
かぶった。>>129>>125宛て。

132:デフォルトの名無しさん
10/02/03 17:32:38
>>127
>memcpyつかった方が転送効率良いよ。
それ言うなら strcat 使え、って話に…
まあ習作なんだろうから、自分でコピーしてみるのはアリかも知れん。

133:デフォルトの名無しさん
10/02/03 17:34:06
>>132
ですよねー

134:デフォルトの名無しさん
10/02/03 17:36:45
>130
やべぇ、何やってんのかさっぱりわからん

135:デフォルトの名無しさん
10/02/03 17:37:00
勉強のためなんだろうから、あえて使ってないんだろう。
最初にj=0にしておけば、mojiCへの代入はすべて
mojiC[j++]= とやれば途中のj++の部分は全部消せる。
最後にmojiC[j++]='\0';とかいれとけ

136:デフォルトの名無しさん
10/02/03 17:43:51
strlen memcpyという関数を自作すれば見通し良い。

137:デフォルトの名無しさん
10/02/03 18:14:08
同一名称、あるいは酷似した名称を使うのは
車輪の再発明で悦に入る行為かもな
内容は同じなライブリ関数を自作して使用するの
は悪いこととは限らないといった程度

138:やってみた
10/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:デフォルトの名無しさん
10/02/03 19:02:08
int m=strlen(a); // 超違和感

140:デフォルトの名無しさん
10/02/03 19:03:45
何故sprintf()を使わないのか?無意味な苦労はバグを生むだけ。

141:デフォルトの名無しさん
10/02/03 19:18:46
無意味な苦労でも、車輪の再発明でも、実装を知っていることは良いことだ。
日本のイット業界なんかアルゴリズム詳しく知らなくても仕事できちゃうもん。
あはは。

142:推奨
10/02/03 19:51:46
実装など実務経験の間に自然に知って欲しかった
というのはあるかも知れないが
いつの時代でもコンスタントにそれが
出来るとは限らない
とりわけ露出狂時代にはね。

143:デフォルトの名無しさん
10/02/03 22:53:58
>>141
だって、技術者じゃなくドカタだもん

144:デフォルトの名無しさん
10/02/03 23:07:14
アルゴリズムってなに?

145:デフォルトの名無しさん
10/02/03 23:08:48
>>144
Wikipedia読んで、それでもわからなかったら、丸一日考えて、
それでもわからなかったら、何がわからないのか質問しなさい。

146:デフォルトの名無しさん
10/02/04 09:22:26
>>144
いーっぽすすんでまえならえ~♪

147:デフォルトの名無しさん
10/02/04 10:37:05
コンパイル環境のエンディアンを調べるれるようなマクロとかってある?
それか明示的にエンディアン指定できるpragmaとかあればいいんだけど

148:デフォルトの名無しさん
10/02/04 11:23:22
こういうのか
URLリンク(www5d.biglobe.ne.jp)

149:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/04 15:46:26
if(n==0)で0の時だけ処理分ける

151:デフォルトの名無しさん
10/02/04 15:48:50
>>149
何と同じにするのか分からん

152:デフォルトの名無しさん
10/02/04 15:58:59
>>149
2進数はビット演算子を使うのが常套手段じゃないのかな?

int n;
n = 15;
do {
printf("%d\n", n & 1);
} while ((n >>= 1) > 0);


153:デフォルトの名無しさん
10/02/04 16:03:20
>>152 n進数への応用がきかない。

154:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/04 16:35:11
そもそも>>151の言うように、どういう出力を期待してるのか
質問者は書いてみてくれないか


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch