signed char s = 'ア';
とすると、マイナスの値になりますが、マイナスの値になると何か支障がでるのでしょうか?
下記サイトに、
>ASCIIコードと1バイトのJISコードだけが使用可能です。
>それでもJISコードを使用するときは、unsigned char型である必要があります。
>それは半角カタカナ等が(161〜223)に定義されているためです。
http://c-production.com/contents/c/sec02.html#05 と書かれています。
最上位バイトが立つ文字を扱うときは、unsigned charにしなければならないのでしょうか?
C/C++コード中のキャラクタセットの扱いなんてバッドノウハウの詰め合わせみたいなもんだから 正解は無いよ
>>2 そもそも半角カナ使うこと自体が間違ってる..
とか言ったらこのスレッドでは叩かれちゃう?
>4 ヨーロッパ言語のアクセント付き文字だってカタカナと変わらん。 ñ á é í ó ú ü ç œ é è à î ô û ï
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++;はなにを意味しているのですか?
ポインタを進めている
>printf(" %7.2f", *a_p); a_p++; この部分、 printf(" %7.2f", a_p[i * ncol + j]); と同じ
>>6 半角カナはchar1個分なのにマイナスってことじゃないの?
よくわからんけど
#include <stdio.h> int main() { if ('ア' > 0) printf("plus.\n"); else printf("minus.\n"); return 0; } を実行すると、 minus. になった。半角カナは負数扱いらしい。
そうなったのは、そのソースファイルが SJIS になってるからでは?
13 :
デフォルトの名無しさん :2010/01/31(日) 19:59:34
>>7 です
a_p++;
がなくてもfor文があるからいいわけではないんですか?
いいけど、a_p は ++ されないよ
32Bitマシンと64Bitマシンって何が違うんですか? コンパイラは違いを吸収してくれますか?
32ビットマシンの場合はint, long, pointerが全部32ビットなので、それら の区別をあいまいなまま使用しても動いてしまった。 64ビットマシンの処理系はint 32ビット、longとpointerが64ビットのデータモデル を使っている場合が多い。書き換えが必要になる場合がある。
>>11 試しにif内の0をunsigned intでキャストして実行してみろ
>>16 ポインタサイズがちがうということは32BitでビルどしたDLLを64Bitで使うとかすると死ぬわけですね
dでした
いつもgccでmakeしてるプログラムが有るんだけどVisual C++で同じようにコンパイルできる? とりあえずVisualStudioインストールして少しいじってみたけど分からない
makeの形式が違うだろ 自動変換できる風呂グラムでもあれば出来るが
>>18 64ビットプロセスから32bit dllはロード出来ないから安心しろ。
そこいら辺はOSがよきにはからってくれる。
#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;} 素数判定のプログラムですけど、先生からは無駄が多いと言われました どこを直していけば無駄が少なくスマートなプログラムになります?
基本は、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");
>>22 ・forループの中で調べるのは奇数だけで十分
・forループ継続条件はi*i<=xで十分
つ
http://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);
}
1は素数じゃねーよw
1って素数だっけ いやまぁどうでもいいけど
http://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 :2010/02/01(月) 13:53:26
確かに素数を調べるのに、for文の中は奇数だけで十分ですね 変数X/2でも十分なのも指摘されて気がつきました 引数の使い方がまだ少しあやふやなので関数は作らないようにしてたんですけど 関数を作った方が大分さっぱりとしたプログラムになりそうですね どうもありがとうございました
ソースコードにMSVC BCC GCCとか判別するマクロ組み込むやつあるけど これはどこで調べられるんですか。 コンパイラが勝手に定義するんだろうけど。 一覧表とかありますか。
MSVCのときだけ、#include "stdafx.h"を有効にしたいんですが。
#ifdef _MSC_VER #include "stdafx.h" #endif
>>32 VC2008でエラーが出ます。BCCだと平気です。
stdafx.hなしでコンパイルできる方法ないですか。
fatal error C1020: 予期しない #endif です。
_MSC_VER __TURBOC__ __GNUC__ それぞれのコンパイラのマニュアルを参照するしかない そもそも stdafx.h 自体要らないのでは? プリコンパイルヘッダの設定を変えればいいと思う
予測では、stdafx.hが何よりも速く読み込まれないとエラー出る仕組みになってると思います
「プリコンパイルヘッダを使わない」という設定にすればいい
プリコンパイル済みヘッダーを使用しない にしたら出来ました。サンクス
>>33 マジか
試さずに書いて申し訳なかったが、プリコンパイルヘッダへの
アプローチはBCCの方が正しいと思う
M$は何か変
M$のプリコンパイルヘッダは#include "stdafx.h"を特殊処理するので今時他と共存させるのなら使わない方が無難。 と書こうとしたら既に書かれていた件。
ビルドする前にクリーン(*.pchを削除) をするのが最善 (プリコンパイルドヘッダも当然使う)
VCは前回のコンパイル途中結果をディスクに保存し再利用して 処理時間を加速する。この時ヘッダファイルが更新されることは 仮定していない。通常のファイルは更新してもおkだが ヘッダファイルを書き換えた場合は、途中結果をクリーン してビルドしないとおかしなことになることが多い。 VC周りのトラブルのかなりの部分を占める。
( ´▽`) ♪
43 :
デフォルトの名無しさん :2010/02/01(月) 22:28:39
GetHitKeyStateAll関数は、キー入力を常に監視しえいるのでしょうか? あるキーが押されている時はAの処理で、 押されていない時はBの処理、としたいのですが、 if( Buf[ KEY_INPUT_Z ] == 1 ) {処理A} else {処理B} キーを押してAの処理は実行されるのですが、 キーを押すのを止めても、処理Bが実行されません。 独自に本などでC言語を勉強したので、 結構難しい問題も解けるようになったのですが、 実技?は全く駄目です。 よろしくお願いします。
>>43 GetHitKeyStateAll 関数が呼ばれた時点でのキーボード情報をどっかに保存するだけでしょ
45 :
デフォルトの名無しさん :2010/02/01(月) 22:38:47
なるほどです。 とすると、常にあるキーの状態を監視しようとすると、 while文を使えばいいのでしょうか?
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(???){ ←はどのように書けばいいでしょうか? 質問が雑だし初歩的ですみませんが、よろしくお願いします。
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 :
推奨 :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{ ....一部不一致のものがある場合 }
>>48 for(i=0; i<10; i++) if(x[i]) break;
if(i==10)
>>48 i==0 のとき a==0
∴x[0]は任意 かつ i!=0 のとき x[i]==0
>>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;
関数じたいをを配列みたいにすることって出来ますか 例えば void A[0]() { ............. } void A[1]() { ............. } void A[2]() { ............. } 呼び出すとき A[i](); こんな感じで
>>56 無理
呼び出す方かどこかで関数ポインタの配列を持って
それで分岐するなら可能
for文の条件式に配列を指定したんですけどうまくいきません int a[10]の0番目の要素を見てfor文を回したいんですよ
な〜に〜 やっちまったな! 男は黙って↓
pascal
>>59 for(;ここに条件式を書きなさい;){}
>>62 int a[10]={0 , 10 ,10, 10, 10, 10, 10, 10, 10, 10};
for(a[10] ; a[10] <10 ; a[10]++)
{
}
です。
0番目の要素って言ってなかった?
引数も戻り値もvoidの関数って コンパイル時にdefineのように扱われるのかな
char str[10]; str = {"2","3","4"} っていれたあとは、str[3]〜[9]は空ですよね? これを削除してstr[3]に変えることってできますか?
↑空の部分を削除してって意味です。 わかりづらくてすいません。
> っていれたあとは、 はいりません。 > str[3]〜[9]は空ですよね? 空の定義は?
配列の初期状態は未定義か\x00か
たとえば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個と増えた場合階層が深くなりすぎて大変です。 変数の数が増えてもすぐ対応できるシンプルな記述方法はないでしょうか。
再帰を使う。
>>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配列の要素を増やしていく。
あとは、その配列を使う。
>>72 頭が固くてぱっとは見えませんが調べる方向はわかりました。
どうもありがとうございます。
for(n1=n2=n3=0;n1<n1Max;++n3,n2+=(n3>n3Max?(n3=0,1):0),n1+=(n2>n2Max?(n2=0,1):0)) /*any処理*/;
常に { } で括らなくちゃいけないわけではないので 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 よっぽどスタックが浅いのか、あるいは局所変数がデカいのか。
80 :
デフォルトの名無しさん :2010/02/02(火) 11:54:57
>>78 それは本当に再帰の限界だったのか?
再帰に限ったことではなくループや順次でも n 回目からおかしいといバグは出るが
それだけでループが n 回までに制限されているという結論は出せないだろ
>71 10個100個になるのは異常 深くならないように工夫する >72 ふ〜ん、考えてみるか >73 大域変数とプロシジャでも使うのか >76 100個になったときを想像したら
>>73 さらっと書いてあったので簡単かと思いきや
nextの動きを理解するのにめちゃ時間かかってしまったw
日常的に使われるテクニックなんでしょうか。
>>77 数個程度のオーダーなら一番読みやすいですね。
どうもありがとうございます。
再帰についてはこれから調べてみます。
>>81 > 100個になったときを想像したら
プログラムで生成すればいい。コンパイラリミットとの戦いになるけど。w
>>71 for(i=0; i<pow(10,n); i++) {
n0 = i % 10;
n1 = (i / 10) % 10;
n2 = (i / 100) % 10;
....
85 :
73 :2010/02/02(火) 13:25:38
>>82 日常的に使われるかどうかは分かりません。
必要に迫られてひねり出した苦肉の策です。
もとは、再帰でやっていたのですが、
再帰が深くなりすぎると失敗するみたいなので、
配列を使うことした、ということです。
そもそもからして 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ですら、まともな時間で動作する ような計算量ではない件
3の100乗回か
#include<stdio.h> #define MAX 3 int num[MAX] = {0, 1, 2 となってるときに2をしてするなら num[3] だと思うのですがMAXを使って2を指定するには どうすればいいですか
num[3]は2じゃないぞ
MAXが3だから num[MAX-1]にすれば、2を取り出すことは出来る
> となってるときに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 で参照するんだぜー
char str[10]; str = {"234"} っていれたあとは、str[3]〜[9]は何もはいってないですよね? このはいってない部分を削除することできる? 容量を小さくしたいんですが、strに入れる文字列の長さが毎回違うので。
静的確保してるから無理
mallocについて調べると蝶最高な気分になれるぞ
多少スレ違い気味で質問 str = {"234"} この代入が可能なのは C99 から?
amountという単語が有ってだな容量を表したりするんだ maximumがゼロからカウントするかどうかに関わらず容量と
98 :
88 :2010/02/02(火) 17:55:41
num[MAX-1] で動きました。ありがとうございます
プログラムの設定ファイルの、読み込めなかった場合のデフォルトの値ってプログラムに埋め込んじゃうの?
>>93 >何もはいってないですよね?
いや、何だかわからない値が入っている。
>>101 str[3] は '\0' 固定じゃね?
何が入るかは場所にもよるけどな。 しかし毎回変わるというのがグローバルっぽくないのだが、 容量を小さくしたい、というからにはグローバルなんだろうか。
>101 記憶クラスによる
malloc使って動的に確保すれば char str[3][10]; str[0][10]〜str[2][10]に入れる文字列の長さが違ってもサイズ無駄なく格納できますか?
>malloc使って動的に確保すれば から >char str[3][10]; の類推の段階で、無駄なくつめることができていない char* str[3] ならそう記述する可能性は高まるけど… ポインタと配列に関することは大丈夫か? と不安になる返答だね
試してみた 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;}
>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 }
インデントは専ブラにやらせるのが楽
112 :
デフォルトの名無しさん :2010/02/02(火) 23:17:10
お前が立てるときに足せばいいじゃないか
配列 int out[3]={1,5,3}; の配列の各要素の大小関係を比べるプログラムをfor文で作りたんですけど どうすればいいですか?
宿題は宿題スレへ
最近気づいたんだが、固定幅フォントより非固定幅のほうが目に優しいわ
#defineで定義されたマクロの有効範囲は#undefされない限り翻訳単位内のみとのことですが #define HOO foo という定義を含むファイルをincludeした場合 includeした側にもこのマクロが適用されると言うことでしょうか
>>121 yes
そうでないと インクルードガードが効かなくなっちゃう
そうだよ 意識しなくても標準ライブラリで#defineされたものを普通に使ってると思うけど
逆にファイル外に伝播して欲しくない場合はundefで明示しないといけないと言うことですね ありがとうございました
二つの文字列を連結させるプログラムを書いたんですが 以下のままでは文字列終端の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) ; }
100+300では駄目だろ 100個しかしてないからな
memcpyつかった方が転送効率良いよ。 どんな長さでも動くようにするには、動的確保。 あと初期化する必要なし、手間がかかる。 動的確保 -> memcpyでデータ配置 -> 最後にNULL付加でよし
>>125 >文字列終端のNULL処理
NULL じゃねえ、'\0' 或いは NUL。
てのは置いといて、
>できている気がするんですが
できてる。
無駄は多いけどな。
(2つ目のループは j = i; とすれば要らないだろ、とか)
NULLってのとナル文字(ヌル文字?)の区別を学ぼう。 char c = '\0'がそれ。 あと、char mojiC[100] = {'\0'};こういうことをしておけば、 「mojiC[100]の中身を初期化」の部分は不要。 ただ、普通は配列を初期化なんぞしないで、 文字列をコピーした最後に'\0'をくっつけるのフツー。
こんなふうだ。 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;; }
>>127 >memcpyつかった方が転送効率良いよ。
それ言うなら strcat 使え、って話に…
まあ習作なんだろうから、自分でコピーしてみるのはアリかも知れん。
>130 やべぇ、何やってんのかさっぱりわからん
勉強のためなんだろうから、あえて使ってないんだろう。 最初にj=0にしておけば、mojiCへの代入はすべて mojiC[j++]= とやれば途中のj++の部分は全部消せる。 最後にmojiC[j++]='\0';とかいれとけ
strlen memcpyという関数を自作すれば見通し良い。
同一名称、あるいは酷似した名称を使うのは 車輪の再発明で悦に入る行為かもな 内容は同じなライブリ関数を自作して使用するの は悪いこととは限らないといった程度
void * memcopy(void *d1, const void *s1, size_t sz) { char *d2 = d1; const char *s2 = s1; while (sz-- > 0) *d2++ = *s2++; return d1; }
int m=strlen(a); // 超違和感
何故sprintf()を使わないのか?無意味な苦労はバグを生むだけ。
141 :
デフォルトの名無しさん :2010/02/03(水) 19:18:46
無意味な苦労でも、車輪の再発明でも、実装を知っていることは良いことだ。 日本のイット業界なんかアルゴリズム詳しく知らなくても仕事できちゃうもん。 あはは。
142 :
推奨 :2010/02/03(水) 19:51:46
実装など実務経験の間に自然に知って欲しかった というのはあるかも知れないが いつの時代でもコンスタントにそれが 出来るとは限らない とりわけ露出狂時代にはね。
アルゴリズムってなに?
>>144 Wikipedia読んで、それでもわからなかったら、丸一日考えて、
それでもわからなかったら、何がわからないのか質問しなさい。
コンパイル環境のエンディアンを調べるれるようなマクロとかってある? それか明示的にエンディアン指定できるpragmaとかあればいいんだけど
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にしたときに同じ結果を得るにはどうしたらいいのですか?
if(n==0)で0の時だけ処理分ける
>>149 2進数はビット演算子を使うのが常套手段じゃないのかな?
int n;
n = 15;
do {
printf("%d\n", n & 1);
} while ((n >>= 1) > 0);
#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; }
そもそも
>>151 の言うように、どういう出力を期待してるのか
質問者は書いてみてくれないか
while(1)の中で 入力待ちをはさんでenter一回押して 次いくようにするにはどうすればいいですかね?
環境にもよる
>>156 と似たようなことやりたくて、前にこんな書き方してたけど、問題ないですかね
void wait(void){
wchar_t enter[1];
fgetws(enter, 1, stdin);
while(getwchar() != L'\n');
}
>>158 '\n' より先に EOF がくると無限ループしない?
160 :
156 :2010/02/04(木) 22:42:16
なんかこれででけたわ。大丈夫かな? char wait; scanf("%c",&wait);
変数を途中で初期化することは出来ますか? int a=0; 〜 プログラム 〜 /* ここで、一旦0にリセットしたい。 */ 〜 プログラム 〜
そうですね。 単純なことを忘れてました。
>>161 代入って代わりに入れるんですよね
どこに代わりに入れるんですか
166 :
158 :2010/02/05(金) 00:35:30
>>159 有り難う御座います
Ctrl+ZでEOFを入力したところ無限ループにはならなかったのですが
入力した文字にEOFが含まれていると、fgetwsがもう一度入力を求めるような挙動になりました
これはどういうことなんでしょうか
ファイルじゃなくて メモリを freadやfgetsとかする方法って無いですか?
/dev/kmemでもオープンしてみる?
イミフな質問だな こいつは何がやりたいんだろう
170 :
デフォルトの名無しさん :2010/02/05(金) 14:50:55
いちゃいちゃうふふ♪ をみたいのだろう。
171 :
デフォルトの名無しさん :2010/02/05(金) 14:58:18
c言語、郵便料金の求め方 定形郵便 長さが14〜23.5cm、幅が9〜12cm、厚さが1cmまでのもの 重さが50gまでのもの 封書の長さ、幅、厚さ、及び重さを与えて、次の表から郵便料金を計算する。 定形外郵便 上記の条件をオーバーしているもの。 郵便料金 25gまで 定形80円 定形外130円 50gまで 定形90円 定形外130円 100gまで 定形外 190円 250gまで 定形外 270円 500gまで 定形外 390円 1kgまで 定形外 700円 2kgまで 定形外 950円 3kgまで 定形外 1150円 4kgまで 定形外 1350円 なお、次の条件を満たしていない場合は、第1種の郵便物の取り扱いとならないので、その旨の表示を行う。 長さが14cm以上60cm以下である。 幅が9cm以上である 長さ+幅+厚さが90cm以上である。 重さが4kg以下である。 つまりこの条件にひとつでも当てはまれば、(この郵便物は取り扱いできません。)と表示させれば大丈夫です。
で、何? 宿題なら専門スレにどうぞ
最新は134代目だったな。
>>169 今までパッケージしていなかったファイルを
パッケージ化して一部取り出してメモリに格納して処理したい
一時ファイルを作らずにやりたい
で、ファイルでやっていた処理を
メモリ版として使いたい
なるべくソース書き換えたくない
freadならなんとかなるけど
fgets,fscanfとか書き換えるのめんどい
fopenをなんとかしたらなりそうな気がするけど無理か
176 :
175 :2010/02/05(金) 15:02:57
宿題じゃないけど 宿題スレで聞いた方がいい?
宿題じゃなきゃなんだよ。 趣味か? まさか業務じゃあるまい。
ん? 175=176≠171か。
>>175 FILE *tmpfile(void);
で一時ファイルを作るのがいいと思う
実際にファイルが作られるかどうかは実装依存だけど
小さなものならメモリ上でうまくやってくれそうな気はする
stringstreamみたいなのがアレばいいのにね
tmpfileだとバイナリで fscanf等、文字列系の処理がうまくいかない気がする
memccpyとかscanfにするのではダメなのか
つ fmemopen
fopen( filename , "rt" )なのを fopen_b( data , size , "rt" ) ってな感じに書き換えるだけで無いかなと directXで言うD3DXCreateTextureFromFile、D3DXCreateTextureFromFileInMemoryみたいな コード書き換えるか一時ファイル作ります ありがとうございました
>>184 うわああ
それです。
ありがとうございます
ありがとうございます
>>186 うわああ
なんどもありがとうございますといってくれて
ありがとうございます
ありがとうございます
fmemopen()てgcc限定?
gccのbuiltinでは無い。
今はまだglibc限定
for(i=0;i<1;i=i+0.1) { } と書くと、無限に動き続けるのはなぜですか? 0.1を1に直すと正常に動くので、小数のせいかなとも思ったのですが、 {}の中で、0.1刻みの計算をしたいのです。
iはdouble or floatで宣言されてる?
いつも「i++」と置いているので「int」になっていましたw ちゃんと動くようになりました。
コンパイラの警告レベルは高くしる
printf("誤差率 %lf %",a); 誤差率 a % のように表示させたいのですが、半角の%だと表示されません。 全角を使うしかないのでしょうか?
printf("誤差率 %lf %c",a,'%');
有難うございました。
何か本当に入門スレだな
それがなにか?
201 :
デフォルトの名無しさん :2010/02/06(土) 06:55:30
>datファイルを開こうとすると じゃなくて、 “このプログラムを使用して作成したdatファイルをテキストエディタ(TeraPad)で開こうとすると” だろ。 このプログラムが作成しているのはテキストファイルじゃなくてバイナリファイルだから当然だ。
203 :
うんこ :2010/02/06(土) 15:57:07
OS:Windows Vista
コンパイラ:Borland C++ 5.5.1 for Win32
ttp://homepage2.nifty.com/jr-kun/hidemaru_qa/make_dll.html#intro 上記のサイトを参考に秀丸エディタで利用できる「hello world!」を表示するDLLを作る方法を勉強しています
hidemaru.cというファイルに以下の内容を書きました↓
#define HIDEMARU_MACRO_DLL __declspec(dllexport)
HIDEMARU_MACRO_DLL /* __declspec(dllexport) */
LPCSTR hello(void) /* LPCSTR は const char* の typedef */
{
return "hello world!";
}
コマンドラインから「bcc32 -WD -hello_world.dll hidemaru.c」と打ったのですがエラーになってdllが作成されません
エラー内容→bcc32 -WD -hello_world.dll hidemaru.c
どのように修正したらdllが作れるのかどなたかご教示お願いします
さあ、エラー内容を再掲する作業に戻るんだ↓
>>203 #include <windows.h>
void *malloc_e( size_t size, char *name ) { char *str; void *buf; buf = (void*) malloc( size ); if ( buf == NULL ) { str = strerror( errno ); fprintf( stderr, "malloc failed (%s): %s\n size: %d\n", name, str, size ); exit( EXIT_FAILURE ); } return( buf ); } のとこで malloc failed (left): Not enough space size: 7064 ってでたんだけど容量不足?
>>207 おそらく容量不足なんだろうね
もしくはメモリ管理してる部分を破壊したか
209 :
203 :2010/02/06(土) 20:44:44
>>204-206 エラー貼り付け忘れましたすみませんでした。
大変分かりやすいソースコードをアップしてくださり頂きありがとうございました。
頂きましたソースコードを元に勉強してみます
>ポインタ型は、明示的にキャストすることで、非常にユニークな使い方ができます >C/C++ 言語の経験者にとっては、お馴染みの作業かもしれませんが >Java から C# 言語に移行してきた人であれば、ポインタの威力を肌で感じることでしょう voidのポインタを調べていたら、こんな記事を発見 これでは偉そうな事を言っているけど、Javaとか.netのobjectと同じなんですよね? 無理やりObjectクラスを作っているような気がする
>>207 だけど、sizeが大きすぎるのが問題?小さすぎるのが問題??
1 それ以前に沢山mallocした。 2 それ以前にメモリアロケータが管理用に使用している領域を破壊した。 オレの勘では2
>>212 1だとfree()つかってれば開放してれば問題ない??
2は解決策ありますか?
214 :
デフォルトの名無しさん :2010/02/06(土) 22:52:06
バグを取り除く
今時のOSにメモリ容量を考えればメモリ領域の不足にmallocエラーはあまり考えにくいよな 95とかNTの時代には結構あったけど
216 :
デフォルトの名無しさん :2010/02/07(日) 03:11:26
>>210 Object型ってメモリ・マップドI/Oに利用出来るの?
>>215 リアルタイム系OSの場合は規定時間以内に処理が出来なかった
場合はtime_outフラグを設定してエラー値を返すように
拡張されている標準関数も多いです。
mallocもその例外ではなく、指定時間以内にallocに成功しなかった
(システムがディスクスワップやI/Oで忙しい時とか)場合は
NULLが返ってくるでしょう。これは勿論メモりが不足している
という意味ではありません。暫く待ってからリトライして
くれという意味になります。
>>217 質問スレッドであって知識をひけらかすスレッドじゃない。
元質問者のレベルを推測して発言しようね。
>>217 へー。それ何ていうOS?
標準ライブラリと同じ名前で動作が違う関数なんて使いにくそう。
>>217 使う側から見れば便利だけど、カーネルの中のつくりは大変そうだ。
タイムアウトになったら、そこまでのカーネルの中の処理は全部
キャンセルなんでしょ?
ロックの粒度が荒くなって、ヘタするとこの仕様自体が処理遅延の
要因になりかねないな
ページフォルトのキューを貯めていっても 「じゃ諦めます」てなアプリがどれくらい含まれてるかも考慮する必要があるしね
ページフォールトというかページングなんかが起きるようじゃダメでしょ 最悪実行時間が計れない 必要なページはあらかじめ全部読み込んでおかないと
PCでも一度にでかすぎるブロックをmallocしようとすると合計使用メモリにかかわらず失敗するよ。 いまgccで試してみたら2GBで失敗した。ちなみにWinXPで物理メモリは3.25GB。
ああ、sizeは小さかったのね。スマソ
>>223 OS起動時に/3GBオプション設定してる?
そりゃMSのXPx86はOS管理用に2GBのメモリ割り当ててるんだから mallocで2GB以上割り当てようとしたらエラーになるだろ
>>220 逆。プロセスのロジックは若干増える。
システムに協調的にしなければならない
から。システムコールする度にそれに
かかった時間もプロセスのどっかに書
かれて戻るからそれを見て処理手順
をプロセスレベルで変更できる。
人名を配列に入れて扱いたいのですが、できなくて困っています。 name[0]="山田" name[1]="鈴木" name[3]="佐々木" のようにしたいのですが 初心者なので変な質問かもしれませんが、代案があれば教えていただきたいです。
>>229 nameがcharの配列の配列であることを前提として、strcpy。
stringつかえ 初心者はC++STLが一番。 name[0]="山田";と出来るぞ
>>229 char name[4][10]={"渡辺","佐藤","山田","井上"};
佐々木さんとか東さんはどうすればいいの?
234 :
デフォルトの名無しさん :2010/02/07(日) 18:28:26
C++最高いやっほーう!!
>>229 char *name[]={"渡辺", "鈴木", "佐々木"};
でいいのでは
236 :
229 :2010/02/07(日) 18:34:22
みなさん、ありがとうございました。 こんなにすぐに回答していただいて、びっくりしました(^^)
237 :
デフォルトの名無しさん :2010/02/07(日) 19:43:19
環境 mac os gcc -o b.exe daytimetcpcli.c でコンパイルすると下記のエラーが出てしまいます。 ソースは提供されているソースをコンパイルしたものですが、どのようにすれば コンパイルが成功するのでしょうか?よろしくお願いいたします In file included from daytimetcpcli.c:1: unp.h:7:66: error: ../config.h: No such file or directory unp.h:200:30: error: ../lib/addrinfo.h: No such file or directory In file included from daytimetcpcli.c:1: unp.h:214: error: redefinition of ‘struct timespec’ unp.h:294: error: conflicting types for ‘gai_strerror’ /usr/include/netdb.h:263: error: previous declaration of ‘gai_strerror’ was here unp.h:298: error: conflicting types for ‘getnameinfo’ /usr/include/netdb.h:272: error: previous declaration of ‘getnameinfo’ was here unp.h:302: error: conflicting types for ‘gethostname’ /usr/include/unistd.h:451: error: previous declaration of ‘gethostname’ was here unp.h:318: error: conflicting types for ‘inet_ntop’ /usr/include/arpa/inet.h:99: error: previous declaration of ‘inet_ntop’ was here
>unpv12e.tar.gz を持ってきて試してみたところ…README にやり方が >ちゃんと書いてありますがな。ドキュメントはちゃんと読みましょう。 > % ./configure > % cd lib > % make > % cd ../intro > % make daytimetcpcli >でうまくいきました。
配列をサブルーチンに送りたいのですが、 スタイルキャストが必要 とか言って、エラーが出てきてしまいます・・・。 この場合はどうしたら良いんでしょうか?
ソースを出せ
いやです。醤油じゃだめ?
fpos_t についてですが、ファイルに変更を加えなければ、何度ファイルを開いても 同じ fpos_t値 は常に同じところを指すのでしょうか? おしえてください。
243 :
デフォルトの名無しさん :2010/02/07(日) 23:31:13
>>238 すみません。その操作はいったいなにをしているのでしょうか?
うわー
スティーヴンス本は、プログラマのバイブルだよな
猫の話をここでするな
251 :
249 :2010/02/08(月) 14:35:35
ごめんなさい
252 :
デフォルトの名無しさん :2010/02/08(月) 14:38:58
Solarisたんの mkfile コマンドを、遊びでLinuxに移植しようと 思うのだが、zero埋めってどうやればベストなのかな? zeroのバッファを用意してwriteしまくる、だと遅いのかな。 truncate(2) の方がいい? # いや head とか dd 使えばいいだろ、とか言わないで ><
lseekして最終ブロックだけ書く。
254 :
デフォルトの名無しさん :2010/02/08(月) 14:44:27
>>253 あ、それいいね。じゃあそうするわ。
ありがとう。
この世界の害悪にまみれ 僕は悲しみをためる それを癒すのは貴女だけ 朝に、昼に、夕に、夜に 僕は貴女を称えよう 奇跡の降り積もる日を待ち望み 余すことなくこの身の全ては 貴女に捧げられる供物である どんな暗闇が僕を遮ろうとも やがて貴女に辿り着くだろう 深き愛情の奇跡の証に 羊のように従順に尽くす僕の魂 僕は貴女に恋をしてしまいました。 いかなる誘惑も貴女への愛情を 揺るがすことはないでしょう 私は貴女のことを愛しています。 御返事お待ちしています。
>>240 すいません寝てました・・・。
ソースを貼り付けたいのですが、
32行じゃ収まりきれません。
どこかソースを上げるサイトとかあったはずなのですが、
どこか教えていただきたいです。
257 :
デフォルトの名無しさん :2010/02/08(月) 18:39:11
codepad.org
すいません眠くなりました... 寝てからうpします。ごめんなさい
どんだけ寝るんだよw
ナルコレプシーだな
SIZEを初期化しようとして SIZE size=SIZE(0,0); と書いたエラーになりました。 size.cx=0; size.cy=0; と2行で書くのではなく、1回で初期化を記述するのはどう書けばいいですか。
>>265 2行目と20行目の引数が違う。
3と53、4と71、5と86も違う。
ぜんぜん違う。
なんで
int,int);
って宣言しておいて、
int lend,int hanoi[300]){
にしちゃってるの?
>>266 どういう意味ですか?
つまりどこが悪いと仰ってますか?
お前の頭が悪い
汚ねぇww
>>270 あまり書き慣れないので・・・。
すいません
もっと基礎からやり直せw
>>271 (1) プロトタイプ宣言(2〜5行め)と、実際の定義(20行め、53行め,…)の引数の型が一致していない
定義の方が正しいのなら、
int move(int,int,int,int,int,int,int,int,int,int,int,int *);
とでもする。
(2)38行めなどでkui2()などを呼び出す際、最後のパラメータとしてhanoi全体を渡したいのなら
kui2(d,e,f,n,m,l,z,lena,lenb,lenc,lend,hanoi);
とする。
(3)kui3()のelseの閉じ括弧'}'がない
以上を直すと、一応コンパイルは通るけど暴走する。
面白い解き方だとは思うが 個人的には hanoi[300] よりも hanoi[3][100] にして欲しい
>>271 初心者のソースが汚いのは当然のことだから恥じることはない。
ただ一般的に「自分だけが理解できるソース」には価値が無いということを覚えればいいよ。
277 :
デフォルトの名無しさん :2010/02/08(月) 22:23:06
> 自分だけが理解できるソース 自分しか読まないコードはそれでいい 「初心者」は仕様そのものさえ憶えればいい それさえできていれば組織ごとに違うスタイルには対応できるし アルゴリズムやイディオムは無数にあってライフワークになる あんまり初期から頭を固くすることこそ避けたほうがいい
爺さん達よ、パソコン甲子園目指している若人をじじいじじいといたぶるなよ
↑くやしいのうくやしいのう
/usr/lib/gcc/spu/4.1.1/../../../../spu/bin/ld: .bss exceeds local store range /usr/lib/gcc/spu/4.1.1/../../../../spu/lib/crt1.o: In function `_start': (.text+0x28): relocation truncated to fit: SPU_ADDR18 against symbol `_end' defined in *ABS* section in spe-main /tmp/ccCjxW2K.o: In function `get_smith_waterman_score': sample.c:(.text+0x1b8): relocation truncated to fit: SPU_ADDR18 against symbol `score' defined in COMMON section in /tmp/ccCjxW2K.o /tmp/ccCjxW2K.o: In function `set_query_array': sample.c:(.text+0x5bc): relocation truncated to fit: SPU_REL16 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o /tmp/ccCjxW2K.o: In function `set_database_array': sample.c:(.text+0x7b4): relocation truncated to fit: SPU_REL16 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o /tmp/ccCjxW2K.o: In function `main': sample.c:(.text+0x91c): relocation truncated to fit: SPU_ADDR18 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o sample.c:(.text+0xa88): relocation truncated to fit: SPU_ADDR18 against symbol `score' defined in COMMON section in /tmp/ccCjxW2K.o sample.c:(.text+0xb5c): relocation truncated to fit: SPU_REL16 against symbol `params' defined in COMMON section in /tmp/ccCjxW2K.o /usr/lib/gcc/spu/4.1.1/../../../../spu/lib/libgloss.a(sbrk.o): In function `sbrk': /home/sur/jordics/sdk3.1/src/redhat/BUILD/spu-newlib-1.16.0/obj-spu/spu/libgloss/spu/../../../../src/libgloss/spu/sbrk.c:53: additional relocation overflows omitted from the output collect2: ld returned 1 exit status って意味のわからんエラーがでたのだが、なんだこれは??
ぐぐれ
>>281 リンカのスクリプトがおかしいんじゃないか
>>272 そうすることにします。
とりあえずポインタの勉強をまったく勉強してなかったので
サブルーチンと一緒にポインタの勉強もするようにします
>>273 ありがとうございました!
一応通りますけど無限ループ状態ですね・・・。
配列自身を渡すにはポインタが必要なんですか?
>>274 二次元配列っていう方法もありましたね!
最初に配列を3つ使って考えてましたが、
その方法もいいですね。
>>275 ありがとうございます
これは練習なので自分だけが読むプログラムですが、
こういう場で質問した時にも解り易いプログラムを書けるようにします
>>276 最大でも、何個ぐらいの引数にした方がいいですか?
>>277 ありがとうございます
学ぶより真似よ、ですか。
頑張ります
>>284 引数が5個以上ってのは、あんまり見ないけど(C++/Javaの場合)
作ってから1〜2週間すると、引数に何を渡せばいのか自分でもわからなくなるよ
int kui1()、int kui2()・・・って関数に名前を付けるのもいいけど、
普通はローマ字じゃなくて英単語を組み合わせるべき(例外を除く)
関数や変数の名前に統一感が無いと思ったら、「c言語 命名規則」とかでググってね
>>283 すいません。もうちょっとわかりやすくお願いします。
287 :
デフォルトの名無しさん :2010/02/08(月) 23:22:50
ある分野では引数が11個とかがのっけから出てくるが
お前らにはFORTRANの数値演算ライブラリは使いこなせない。
>>287 それは特別な分野じゃまいか?
普通のプログラミングで11個は現実的じゃないと思うんだけど
削れん引数を五個くらい持った関数が出てきた辺りで構想間違いを探しに過去への旅に出る
294 :
デフォルトの名無しさん :2010/02/09(火) 01:58:37
>>292 そこで精神分裂を起こすのが日本人の克服すべき弱点だ
信じた道は並み居る論敵を蹴散らして我が道を歩み頂で血化粧のβエンドルフィンに酔え
引数34個がどうした! 何か悪いのか、えーおいチビ、ぶっ殺すぞてめえ!! これができないからナメられるんだよ
引数が5個以上になったら普通は構造体とか使ってまとめるもんだろ その方がオーバーヘッドも小さくなるしソースも読みやすくなるし それができなきゃ設計ミスだ
3次元座標3点の重心を求める関数を作成せよ 構造体?わかんねーからx1,y1,z1...でいいか 戻り値で構造体を受け取るにもよくわかんねーから引数にポインタでいっか void getgrav3(float *x,float *y,float *z,float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3);
設計ミスじゃなくてプログラマーのレベルが低すぎただけだったなんて!
そりゃパソコン甲子園(笑)だもんな。
全部グローバル変数にするよりはマシ
>>299 パフォーマンス上の理由でそうすることはあるよ。
でも基本は「安易にグローバル変数にするな」だろ
ゲーム屋にはよくある事
デバグや障害原因調査をやりやすくするためにグローバル変数使うこともあるけど、 入門編で初心者にする話じゃないな
完成品が大事。 念仏のように、使うなっていうのは良くない。 生産性・効率次第。 グループで変数が統一して理解していて、マルチスレッドで アクセス済んでなければ、関数の引数や戻り値が減らせて 良いこともある。
クラス内変数や配列も クラスを外せばグローバル。 クラス内のグローバル。 共通して使う変数はクラス化するのが良いとは思うが
ファイルポインタをメインで定義して、サブルーチンでオープンしているプログラムです。 下のfile1.c , file2.c , file3.c を結合して実行したところメモリを壊してるようなエラーが出てしまうのですが原因はなんでしょうか? 「file1.c」 extern int file2(FILE*) extern int file3(FILE*) int main(void) { ___FILE *fp; ___file2(fp); ___file3(fp); ___return 0; } 「file2.c」 int file2(FILE* fp) { ___fp=fopen("test.txt","w"); ___fprintf(fp,"テスト1"); ___return 0; } 「file3.c」 int file3(FILE* fp) { ___fprintf(fp,"テスト2"); ___fclose(fp); ___return 0; }
ポインタのポインタ
extern FILE* file2(FILE*) fp=file2(fp);
>>307 > 下のfile1.c , file2.c , file3.c を結合して実行したところメモリを
> 壊してるようなエラーが出てしまうのですが原因はなんでしょうか?
main()で定義されたfpが、file2()によって更新されないから。
正しくは、
int main(void)
{
___FILE *fp;
___file2(&fp);
___file3(&fp);
___return 0;
}
int file2(FILE** fp)
{
___*fp=fopen("test.txt","w");
___fprintf(*fp,"テスト1");
___return 0;
}
など。
FILE *fp = NULL; char buffer[16] = ""; のように、常にNULLや空文字列で初期化するのって意味ありますか?
バカ除けのお札
>>312 NULLで初期化は realloc をループで使うときに有効
どう便利なんだろ
>>312 nullポインタを使った書き込みは例外が出るけど、ランダムに初期化された場合はそうでない場合がある。
二重にfreeするのを防げる。 一回freeしたものをあとでfreeしてると、 意外なタイミングでおかしくなるので見つけにくいバグになる。
ポインタを返す関数内で、一度も設定しないまま返るケースがある時は必須だべ
やっぱりバカ避けってことだな
初期化でNULLを設定してしまうと、コンパイラが初期化しないパスがあるという警告を出してくれなくなるので、そのNULL設定自体に意味があるのでなければ、設定すべきではない。
321 :
デフォルトの名無しさん :2010/02/10(水) 23:10:52
警告以前にバカコードを書く者の脳をデバッグすべき
>>325 多分キミがアホなんだと思う。
ポインタのスコープ抜けるときに
if (p) free(p);
と言うつもりなのだろう。
free(p)してもpにNULLは入らないと思うが
「スコープ抜けるとき」と書いただろ。
if (p) { free(p); p = NULL } って安全なの?
書いた奴に聞いた方がいい
>>329 そういう習慣がないではないことは理解できますが、一方で *p する前にはかならず null チェックしないと意味がないし、それもしんどい作業だなあ。
>>329 普通はマクロdeleteを使う
delete p;
>>312 意味が無いっていうか、マイナスだよね。
本当の初期化を忘れたときに、警告がでなくなる。
C99やJavaみたいに、変数の宣言が自由なところでできる言語なら、 使う直前で、宣言&初期化。 C89みたいに、ブロックの先頭でしか宣言できない言語なら、 使う直前で初期化。 (って書くと、文法上の初期化と代入がどうこうって、あさっての 方向に話題を持っていくやつが現れるのが、いつの流れだけど)
>>336 明後日も何も質問の
>>312 がその「文法上の初期化」についてでは・・・
さておき、離れて使う場合でも宣言時の初期化で良いと思うよ。
むしろそれで把握しづらくなるほど長い関数を作る方が問題かと。
まぁこの辺は文化の差なんじゃないの?
>>337 それじゃ、コンパイラに指摘してもらえない。
その論理なら、関数を短くすればすべてのバグがなくなる。
いつでも全部初期化するのは反対 必要な分だけでないとデバッグ時に 初期値のチェックからはじめなきゃならなくて面倒
340 :
デフォルトの名無しさん :2010/02/11(木) 21:21:47
char *p = NULL; p = malloc(1); とか、ふつーに見限られるコードだしな
ポインタだけは初期値NULLがいいな
>>337 「常にNULLや空の値で初期化」って、機械的にそうするってコーディングスタイルの
ことでしょ?
(違うならいいけど)
そういう文化があるってのは知ってるけど、相対文化論じゃないし優劣なしって
ことはないよ。
小さい関数しか書かないから、どこで初期化しても同じって話しなら、
for (i = 0; i < N; i++)
とかしないで、
int i = 0;
:
for (; i < N; i++)
とか書いてもOKみたいな話になっちゃうでしょ。
>>342 for については意味付けを考えて欲しいな
345 :
デフォルトの名無しさん :2010/02/11(木) 21:37:02
347 :
デフォルトの名無しさん :2010/02/11(木) 21:42:33
>>345 有名なプロダクツでそういうスタイルが採用されているとか、
著名な人とか定番みたいになってる書籍で、そういうスタイルが
薦められてるとか、ないんじゃないの?
349 :
デフォルトの名無しさん :2010/02/11(木) 21:53:18
>>348 まあ有名なムやマに凶悪さでも有名なのはあるが
たとえその本人であっても突っ込んで帰ってきた返事がクソなら
ブランドに係わらずその議論に対する評価はクソだが
>>342 すまん。言葉が足らんかった。
無意味な初期化はしてはいけないと考えてるよ。
害にしかならない。
forは、自分ではそんな書き方はしないけど、
積極的に直させる程の事もないと思う。
for文の存在意義の半分を捨ててる以外は、
問題あるように見えない。
static変数って0で初期化される?
される
誰に?
パソコンに
されねーよw
ふと思ったんだが、ゼロ梅されたページをプロセスに割り当てる 実装があれば...
今は、それ多いんじゃない。
あ、まじで?
理由は、セキュリティ上の問題なんだけどな。
>>355 static な変数は 0 に初期化されますね。
初期化されるのかよ でも気持ち悪いから初期化するよな
>>360 ポインタ型も NULL (= 0) に初期化されます。
文脈をおもいっきり無視だな w
368 :
317 :2010/02/12(金) 18:09:54
なんかいろいろすまない。
>>333 さんだけが正解w
「初期化」じゃなくて、freeの後の「代入」の話をしてたね俺は。
>>366 すまん。規格をしっかり見ていないので知りたいのだが、↓はどちらが正しい?
0で初期化? NULLで初期化?
mallocして使用するポインタはNULLで初期化することが多いかなぁ スタイルにもよるけど、関数の途中で失敗した場合にgotoで関数の出口に飛んでfreeしたい場合に、 err: free(p0); free(p1); .... return -1; のように複数のポインタ変数を一括してfreeで記述できるのでわかりやすい。 freeする順序に気をつかったり、err0, err1みたいにくだらないラベルも増えない。
>>369 「静的記憶域期間を持つオブジェクトを明示的に初期化しない場合
そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。」
null pointerを表すビットパターンで初期化される
0(整数値0を表すビットパターン)かもしれないし、0でないかもしれない
大抵の環境では0だけどね、しかしながら、0でない環境もあるので
>>369 どっちも間違え
ISO/IEC 9899:1999 (E) C99でごめんね
6.7.8 Initialization
10 If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
― if it has pointer type, it is initialized to a null pointer;
ついでにnull pointer
6.3.2.3 Pointers
3 An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant .55) If a null pointer constant is converted to a
pointer type, the resulting pointer, called a null pointer , is guaranteed to compare unequal
to a pointer to any object or function.
4 Conversion of a null pointer to another pointer type yields a null pointer of that type.
Any two null pointers shall compare equal.
55) The macro NULL is de?ned in <stddef.h> (and other headers) as a null pointer constant; see 7.17.
どんな値なのかはわからないけど、少なくともオブジェクト(変数)や関数のポインタとは一致しない値を表す特別なポインタ
プログラム上は0か(void *)0で表現できる、またはNULL
C++0xのnullptrにすればすっきりしていいな
>>372 , 373
ありがとう。
早い話が「空気読んで初期化」してくれるということでOKか
つまり、構造体を ={0}で初期化するのと一緒の挙動かな
だよ
>>376 いや、それは又別のセマンティクスがあってだな
「空気を読んで初期化」か、なかなか面白い表現だな
今度使わせていただきます
面白い表現ですね
なんのためにわざわざNULLというキーワードを使っているのか? 0と決まっているなら0でいい。そうじゃないからNULLという文字列に置き換えている。
ホントそうだよなw なんのためにわざわざNULLというキーワードを使っているのか?
>380, 381 はぁ?別に0でいいよ、でも64bitとかだと0Lかな void *にキャストしていてもいいけど
>384 はぁ?
>384 今さら感があるなぁ まぁ、当たり前のことを当たり前のようにかかれているだけだし特にこれといって読むに値する内容でもない
そらお前さん、ここは入門スレだし、
>>380 みたいな奴も居るんだから
ソース上ではヌルポインターは0で決まっていて、NULLはいらない子だったんですね。 勉強になりました。
可読性では (ポインタ)=NULL って書いたほうがいいと思うけど
つまらん事にこだわる奴はLISPでも弄ってなさいって話だ
391 :
デフォルトの名無しさん :2010/02/13(土) 00:21:36
glibcとgccを使ってコードを書いています 「to_aru_name」という名前の関数内のエラーメッセージを表示するときに、 to_aru_name (void *arg) { const char *func = "to_aru_name" ... fprintf(stderr, "%s(): hoge failed: %s", func, strerror(errno)); ... } と書いて、実際のエラーメッセージを「to_aru_name(): hoge failed: File exists」 のように表示させてるんですが、関数毎に「const char *func = "to_aru_name"」の部分を 準備する必要があり手間がかかります。この部分を自動化したい… funcに関数名を自動的に代入or設定する良い方法はないでしょうか? 便利なマクロとか、もしかしてあったりするかな…
__FUNCTION__
394 :
391 :2010/02/13(土) 00:42:49
>>392 ありがとおおおお
printf("func: %s\n", __FUNCTION__);
で確認できた。ちゃんと""付きで展開されるのね…
__FILE__でフルパスがバイナリに入らない方法ってありますか ファイル名だけで良いのにVCもGCCも入ってしまうのですが…
私です
こんなところで成りすまして、なんの得があるんだか。
LISPはいいよ〜 変なのはS式だけで あとは君の思うがままに操れる 素晴らしい言語だ。
402 :
デフォルトの名無しさん :2010/02/13(土) 03:10:05
printf(NULL); と書いていると、コンパイルするときにgccが 「warning: null argument where non-null required (argument 1)」 みたいに、NULLであってはいけない引数がNULLですよと警告してくれるけど、 自分でつくった関数でも同じ警告が出るようにできるかな? int my_func(const char *str) { ... if (str == NULL) return -1; ... } 上のように引数がNULLの場合をチェックしているのだけど、 実行時だけじゃなくてコンパイルするときにも「NULLはダメだ!」と警告されるようにできないものでしょうか? この関数をライブラリにして使うときに、引数がNULLだとコンパイル時に警告させるようにしたい…
>>402 5.25 Declaring Attributes of Functions
`nonnull (ARG-INDEX, ...)'
The `nonnull' attribute specifies that some function parameters
should be non-null pointers. For instance, the declaration:
extern void *
my_memcpy (void *dest, const void *src, size_t len)
__attribute__((nonnull (1, 2)));
402じゃないけど参考に成ったよ。
>>395 あんまり意味なさげだけどVC2005辺りだと
リリースビルドの時はフルパスじゃなくなった気が・・・
407 :
デフォルトの名無しさん :2010/02/13(土) 12:46:36
408 :
デフォルトの名無しさん :2010/02/13(土) 12:48:46
C#→C++に移るのは大変なのか? C/C++からC#は派生したが、まったく別の言語 っていう話を聞いたんだが。 C#で打つと、.NETが必要になるから移ろうかと思っていたんだが。
> C#で打つと 斬新な表現だな。
言語としては同程度の難易度だろ。 C++はアプリ開発には向いてないがな。生産効率は悪い。 C#で10行で済むことが100行-1000行になり得る。 標準部品の品揃えが悪い。
それをC++のスレではなくCのスレで聞くとはいい度胸だな。 あまり先入観を持たずに別言語だと思ってやれば、いいんじゃないの? C#みたいにライブラリやIDEの充実がない分面倒。 そこを差し引けば、そんなに悪くはないと思う(歴史が長い分良くないとこも多い)。
415 :
デフォルトの名無しさん :2010/02/13(土) 13:32:07
>>409 「.NETが必要になるから」移りたいというのはちょっと理解できない。目的から必要性を考えたほうが良いかも。
文法レベルの移行はそれほど大変ではないはずだが、C++の機能をたくさん使いたいなら大変時間がかかると思う。
そもそもC++を使う必要あるのか?単にカッコいい(人によっては他人が読みつらい)コードを書きたいなら話は別だが。
こんにちは、質問があってきました。 私は今、ある計算をするプログラムを組んでいるのですが、double変数を使用しても、変数がオーバーフローする可能性が高い計算を行っています。 オーバーフローすることは一向に構わないのですが、そのあとでオーバーフローしたかどうかの判定をしたいのです。 Cではどうやればオーバーフローしたかどうかの判定ができるのでしょうか? 尚、使用可能なヘッダーファイルはstdio.hのみでお願いします。
float.hもつかわずに浮動小数点数の状態を調べるってか?
コンパイラが対応してないと無理では。 桁落ち、情報落ち、最大最小値越えなど検出する方法はないだろ。 デバッグモードで付いてれば付いてる。
任意精度のGMP使えよ
オーバーフローしたらINFになるんじゃね
そうなのか
doubleって、オーバーフローしたら特殊な値にならないの? NaNみたいな。
そうだよ
stdio.hだけでやるなら使用するCPUの浮動小数点に関するフラグやイ ンラインアセンブラでステータスワードを設定してやる必要がある。 設定の仕方はCPUのマニュアルに書いてある。
#define N 5 int main(void){ int i, n = N * 32; char *s; s = (char *)malloc(n); for(i = 0; i < N; ++i){ memcpy(s, &i, 4);s += 4; memcpy(s, &i, 4);s += 4; memcpy(s, &i, 4);s += 4; memcpy(s, &i, 4);s += 4; memcpy(s, &i, 4);s += 4; memcpy(s, &i, 4);s += 4; memcpy(s, &i, 4);s += 4; memcpy(s, &i, 4);s += 4; } printf("%s", s); free(s); return 0; } これ実行すると問題発生するんだけどどうして?
sがどこを指しているか順次紙に書いてみろ
>>425 sは固定しておいてfree(s);とすべきなのに s+=4; を8回行って
sの値が変化している
その後 free(s); を行った結果は未定義である(鼻から悪魔)
あと、intをmemcpy()して、printf("%s",…); とかしても 表示されない。
memcpyとかmallocとか、基本がわかってない人に説明するのはしんどくないですか?
#define N 5 int main(void){ char *s, *t; int i; int m = '1'|'0'<<8|'2'<<16|'4'<<24; int n = N * 4 * 8; t = s = (char *)malloc(n); for(i = 0; i < N; ++i){ memcpy(s, &m, 4);s += 4; memcpy(s, &m, 4);s += 4; memcpy(s, &m, 4);s += 4; memcpy(s, &m, 4);s += 4; memcpy(s, &m, 4);s += 4; memcpy(s, &m, 4);s += 4; memcpy(s, &m, 4);s += 4; memcpy(s, &m, 4);s += 4; } printf("%s", t); free(t); return 0; }
直すならヌル終端しろよ
432 :
402 :2010/02/13(土) 17:45:59
433 :
402 :2010/02/13(土) 21:39:22
コンパイル時に引数のNULLを警告させる関数を書けたのですが、警告を出した上で
実行時にも変数がNULLか判定させようとすると、判定に失敗してしまいます…
コンパイルオプションで強めの最適化(-O2)をしたときにだけ失敗します。
一体どうなっているんだろう?
ttp://ja.pastebin.ca/1795229 上記のソース(test.c)を
$ gcc -Wall -O2 test.c -o test
とコンパイルして実行すると、my_funcにNULLを渡していても-1を返さずエラーを検知できません。
mainが正常終了してしまいます。
一方、コンパイルする際に最適化オプションを"-O"にすると検知できました。
$ gcc -Wall -O test.c -o test
とコンパイルして実行すると、my_funcにNULLを渡すと-1を返します。
最適化オプションなしでも同じように検知できました。
コンパイルオプションでなぜ挙動が変わるんだろう… "-O2"の何がいけないのだろうか?
実用的には、弱い最適化オプション(-O)でコンパイルすれば済むんですが気になっています。
もう少し詳しい原因が分かる方いらっしゃれば教えて欲しい…
gcc-4.3.2とglibc-2.7を使っています。
>>434 なるほどそうなのかも…
ありがとう。参考になります。
いろいろ試してみました。
-O2を使っていても、
>>433 のソースの24行目のfprintfがなければ、
NULLチェックをしてくれたり挙動がまちまち…
というのは、
ttp://ja.pastebin.ca/1795281 このソースなら、
$ gcc -Wall -O2 test.c -o test
t.c: In function 'main':
t.c:10: warning: null argument where non-null required (argument 1)
$ ./test
my_func failed
-O2付きでもちゃんとNULLチェックしてくれる!どゆことー
FindFirstFile(path, &fd); でD:\下のファイルの情報取得を した後 if(fd.dwFileAttributes== のあとをどうすれば隠しフォルダが 条件に当てはまりますか?
>>435 まぁあれだよ
最適化の効きなんてコンパイラの気分次第
そこまで気にし出すとアセンブラのソース吐かせて見るしか
>>436 「隠し」 かつ 「フォルダ」 なら
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
でいけるかと
439 :
デフォルトの名無しさん :2010/02/14(日) 00:12:05
realloc関数を使用したソースコードにsplintをかけているのですが どうしても警告が消えません。。 そもそもrealloc関数を使用してsplintでの警告は消えないなんてことないのか と思いはじめてきたので質問します! どうなんでしょうか先生。。。
>>438 D\: のSystem Volume informatonです
そのソースコードを晒してもらわないとアドバイスのしようもない エスパーでもなきゃソースコード見ずに「3行目が間違ってるぞ!」とか指摘できるわけない
ああ、そう で?
で?って・・・ で?
>>440 名前がわかってるならその名前で判別すりゃいいんじゃねーの
442は440に向けて
エスパービームを発射した。
効果が無かった
449 :
デフォルトの名無しさん :2010/02/14(日) 21:34:15
#include <stdio.h> #include <string.h> int main(void) //最初に実行される関数 { char name[17] = "ジッキンゲン"; char rank[] = "男爵"; strcat(name,rank); //変数nameの文字列に変数rankの //文字列を合体 puts(name); //変数nameの文字列と改行を出力 return 0; } これって何が違うんですか??
451 :
デフォルトの名無しさん :2010/02/14(日) 21:43:29
辞書より: 「異なる」は比べてみて同じでないことを表すにとどまるが、「違う」は「約束が違う」「答えが違う」 「気が違う」など、あるべきこと・状態から外れることをも言う。 どっちの意味だろ。動かない、って意味なのかな。
国語の入門編から出直してください
>>453 え、どうして?
「これって何が違うんですか?」
→何かが違うから(エラーがでて)動かない
という意味にもとれると思うのですが。
>>454 あなたの思考回路が違っているのか
全角空白を問題としているのか
分かりません
自分で、「〜意味に”も”とれる」と言ってりゃ世話ねーよ。 やっぱり国語の入門からやり直してこい。 聞く時は、「これって何が間違ってるんですか?」にしとけば良かったな。
いや俺は
>>450 が「何と比べて」と聞いているから
そういえば「違う」にもいろいろな意味があるよなー、と思って
辞書を引いてみただけだが。
うぜーなマジで。
[例文] 自分の想定している動作はコレコレなんですけど、 実行してみると何々と表示されてしまいます。 or 〜というコンパイルエラーが出力されてしまいます。 これは何が間違っているんでしょうか?
461 :
デフォルトの名無しさん :2010/02/14(日) 22:31:17
↑ お前もゴミじゃねーの?
↑ようゴミ
悔しがってるw
涙拭けよ
465 :
デフォルトの名無しさん :2010/02/14(日) 22:49:26
ビット演算について質問します。 符号無しの4バイトの型のデータがあったとします。 これは2バイトの上位ワードと下位ワードにわけられます。 今ここで下位ワードを取り出したいとします。 とあるサイトでその方法は↓のようにかかれていました。 low = a & $FFFF; ここで $ とは何を意味しているのでしょうか? 0xのことかな?と思ったのですが、ぐぐってもでてきません。 FFFFにしているのはビットのマスクをしていることなのだと理解はしています。 が、なぜ2バイトのみにマスクをかけているのでしょうか?理解できません。 普通マスクは0xFと0x0二つがあってはじめて意味をなすと思うのですが? もし、a & $FFFFだと、aのビットに何か変化はあるのでしょうか? また、この方法で、aの上位ワード、下位ワードどちらを代入するか指定せずに代入するだけで、 これは4バイトのaの中の上位ワードと下位ワードのうち、2バイトのlowに代入されるときは下位ワードから先に代入されるからなのでしょうか? 回答お願いします。
Pascalでは16進数を$FFFFのように書くが、論理積は&とは書かないしな 何の言語だろう
467 :
デフォルトの名無しさん :2010/02/14(日) 23:01:06
補足です。 別に (4バイトの何らかの型) a; WORD low, high; low = a; //下位ワード high = (a >> 16); //上位ワード; でいいのでは?と思ったのですが、 なぜ (4バイトの何らかの型) a; WORD low, high; low = a & $FFFF; // ← low = a & 0xFFFF;の誤植??あとANDしても結果は変わらないと思うのになぜマスクしている? high = (a >> 16) & $FFFF; // ← high = a & 0xFFFF;の誤植??あと、ANDしても結果は変わらないと思うのになぜマスクしている? にしているのでしょうか?ということです。
468 :
デフォルトの名無しさん :2010/02/14(日) 23:04:41
>>466 ありがとうございます。
では、$は単に0xの誤植っぽいですね。
ところで、なぜマスクしているのでしょうか?
しかも4バイトのデータであるaを2バイトの0xFFFFでマスクしているのですが、
なぜそれが下位ワード2バイト分の場所にわりあてられているのでしょうか?
aをマスクする場合、4バイトであるので、下位ワードだけを残したければ
a & 0xFFFF0000 (リトルエンディアン) だと思うのですが、
もしかして、こういったビットの代入は 左から代入されていくのでしょうか?
そして、入りきらなければ右側は捨てられるのでしょうか?
また、マスクの場合も左から行うということなのでしょうか?
469 :
デフォルトの名無しさん :2010/02/14(日) 23:05:56
間違えました a & 0xFFFF0000 (リトルエンディアン) ↓ a & 0x0000FFFF リトルエンディアン関係ないです
検索してわかったけどそれHSPのページじゃないか HSPって変数に型なんかないんじゃないか
0xFFFFの型は何バイトだと思う?
472 :
デフォルトの名無しさん :2010/02/14(日) 23:11:52
>>470 あ、C言語だと思ったら、違う言語だったんですね。すいません。
>>471 2バイトだと思います
0xFFFF も 0x0000FFFF も DWORD なら同じだよ。 WORD a = 0x12345678 & 0xFFFF; DWORD b = 0x12345678 & 0xFFFF; DWORD c = 0x12345678 & 0xFFFF0000; WORD d = 0x12345678; a = 0x5678; b = 0x00005678; c = 0x12340000; d = ??
476 :
デフォルトの名無しさん :2010/02/15(月) 01:05:22
おまいら仲良くしろ! さもないと、日下部さん召還するぞww
こわがりすぎー
char str[64] = "\0"; としたとき、str[0]のみ\0になるのですか? それとも、str[0]〜str[64]全部\0ですか?
指定されていない要素は全部0
ありがとうございました
>481 根拠は
>>483 プログラミング言語C第2版
273ページ
構造体の = {0} と同じだよ。 アセンブラで出してみると動作がわかる
>>483-484 「不定」とか書いてある根拠なし(有るわけないけど)に根拠要求して速攻返り討ち。
惨め過ぎる。
BCC++だと、すべて0だったね
char str[] = "abc"; との比較はまた別だが char str[64] = "abc"; この文と char str[64] = { 'a', 'b', 'c' }; char str[64] = { 'a', 'b', 'c', '\0' }; こいつらは等価なの?違うの?
?
また違う君か.
>>485 auto な配列でも 0 に初期化されるんですね。しらなかった。
それは無い
>>489 残りに0が入るが、残りの数が違うでしょ。
でも結局4番目に0が入るのは変わらない。
>>493 いやいや、それが手元の gcc, bcc32, cl, で試すと 0 に初期化されたんですよ。K&R2 の該当ページでは
いまいちよくわからなかったんですが。
memset(str, 0, sizeof(str)); するべき
しなくていいけどしてもいい
数値の切捨てにこれ使うのマズイですかね? #define Floor(x) (int(x)-1+int((x)-int(x)+1))
>>498 標準の関数(math.h) に floor(), ceil() があるのでそちらを。
>>496 規格で決まっている以上、余計なことをする必要はないのでは?
あと、double や * のときには、困ったことになりますね。
書いて馬脚をあらわす感じがします。
>>499-500 関数呼び出しより速いかなー?と思ったのですが、
やっぱり変なことはしない方がいいですかね。
ありがとうございました。
14
>>501 ちょっといいすぎたので、軌道修正するとすれば、理解のための試行錯誤に価値がないわけではありません。
>>498 #define FLOOR(x) ((int)(x) > (x) ? (int)(x) - 1 : (int)(x))
あたりがわかりやすいかと。
C言語なら俺に質問しないで試せ(入門編)Part 60
つーかintにキャストが自動的に切り捨てじゃなかったっけ?
質問スレだよな・・・
雑談スレ
>>507 int(-0.1)=0
floor(-0.1)=-1
そもそもintへのキャストが関数呼び出しでない、とは限らないけどね ただの除算だってCPUやアーキによっては関数コールになるし
>>508 自作マクロと標準関数のどっちが早いか
とか、他人に調べさせるなよ。
>>494 'c'の後に0が入るが、残りの数が違うでしょ。
残りの数って? 64-3=61 でないの?
>>1 上は'a','b','c'と入れて残り61個に0を入れる
下は'a','b','c',0と入れて残り60個に0を入れる
r ‐、 | ○ | r‐‐、 _,;ト - イ、 ∧l☆│∧ (⌒` ⌒ヽ /,、,,ト.-イ/,、 l つまり同じってことだ! │ ヽー―'^ー-' ( ⌒γ⌒~~ /| │ 〉 |│ |`ー^ー― r' | │ /───| | |/ | l ト、 | | irー-、 ー ,} | / i | / `X´ ヽ / 入 |
言語以前の質問で悪いけど…… とりあえず初心者は猫でもわかる〜〜で勉強しとけばおk?
>>516 オライリーのC実践プログラミング 第3版
ロベール
519 :
デフォルトの名無しさん :2010/02/16(火) 20:16:25
>>516 猫も悪くはない
要は何ができそうか、可能性を感じられるきっかけであることで
厳密な正確性は当初後回しでもいい
可能性を感じてから「ふーん」で終わるか「やってやる」とくるかが最初の適性試験
コンパイラがない状態の入門はどこでできますか? 参考書などを購入したのがいいですか? 趣味の範囲でプログラミングを始めたいと思ってます。 ちなみに高校生で大学の先取りも兼ねています。
>>520 実際に動かしながらでないとなかなか身につかないよ
英語と一緒
PCさえあれば、コンパイラなんてどうとでもなると思いますが。
523 :
デフォルトの名無しさん :2010/02/16(火) 21:00:01
>>520 無料のコンパイラは腐るほどあるが・・・
おまえさん、そうではなく特定のコンパイラに毒されることを怖れてるんだろ?
あ・き・ら・め・ろ!
極論すると C という特定の言語に毒されることにも問題がなくはないんだぞ
で、何ができる? 違うだろ、何かするんだよ
what から入れ、how がたまたま C だったら、またおいで
javascriptで良いじゃん
525 :
デフォルトの名無しさん :2010/02/16(火) 21:09:06
ここは、(入門編)なんていうスレタイに釣られた初心者を上級者が痛めつるスレであります。 空気が読めない、打たれ強い人間だけが最後まで残ります。
そうだったんですね 他あたります
スレタイから質問スレだと勘違いされてるが、厳密にはそれは誤解だ 語りたい盛りのCユーザー(入門者)が「俺に聞け」って言ってるだけ
529 :
デフォルトの名無しさん :2010/02/16(火) 21:35:51
語りたい盛りのCユーザー(入門者)を上級者が痛めるスレですねw
入門程度の知識で間違ったこと語るから痛めつけられるんだよ。
#define a b #define b c #define c d … … a; b; c; って書いたら、どういう風にマクロ展開される? b; c; d; になる?それとも、 d; d; d; になる?
ホントに「〜したらどうなる?」っていうのが多いなw そんなの1分もあれば試せるだろ
プリプロセスだけしてくれるオプションがコンパイラにあるはずなので、 マニュアルを読みましょう
hu-n
>>520 つ http;//codepad.org
>>531 gcc なら
gcc -E test.c
などとすれば試せる。ちなみにこのやりかたは google で「gcc プリプロセッサ」というキーワードで検索した。
(´・ω・`)
541 :
デフォルトの名無しさん :2010/02/17(水) 00:15:59
>>531 ここで発言している間に確認できるだろ。
よっぽどの馬鹿かわざとだな
542 :
デフォルトの名無しさん :2010/02/17(水) 00:17:42
むかーしむかし。fjに日下部さんという人が居ました。 つづく
まだ実在の人物と思ってる奴がいるんですね。
一時期は何人も日下部がいたもんだが。
兄が大変ご迷惑をおかけしました。 よく言い聞かせておきます。
mixiで暴れまくってたとこまでは知ってる
ファイアウォールがどうかしたんですか
549 :
デフォルトの名無しさん :2010/02/18(木) 16:51:00
日下部さんは良い人だよ。奥さんも美人です。本人はアホの坂田みたいな顔してますが。
このスレが「C言語」となっている限りこのスレにはこないでしょう。 彼の世界では、「言語C」だけが存在していて、「C言語」なるもは存在しないのです。
深いな
糞壁早く死なないかな
voidの話しはスレ違い
↑void氏ね
555 :
デフォルトの名無しさん :2010/02/18(木) 17:37:40
> 「C言語」なるもは存在しないのです。 まだ言ってたら藁だな
日下部みさお
ファイアウォールみさお
558 :
デフォルトの名無しさん :2010/02/19(金) 01:53:32
WindowsXP + VisualStdio2008(+付属SDK) です。 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){ ULARGE_INTEGER FreeBytesAvailableToCaller; FreeBytesAvailableToCaller.QuadPart = 1; TCHAR tnob[256] = _T("a1"); return 0; } なぜかこれをコンパイルすると、 error C2275: 'TCHAR' : illegal use of this type as an expression というエラーになります。tchar.hをインクルードしているのに、TCHARが使えないなんてありえないと思うのですが。 しかし、 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow){ ULARGE_INTEGER FreeBytesAvailableToCaller; TCHAR tnob[256] = _T("a1"); return 0; } こうすると、なぜか上記のエラーはなくなります。 いったいなぜなんでしょうか?ULARGE_INTEGERのQuadPartはULONGLONG型であり、普通に1を代入できるはずなのですが。 そもそも、ここがおかしいのと、TCHARが使えないことに関係はないと思うのですが。 解決策わかるかたおられますか?
>>558 ファイル名を 〜.c から 〜.cpp に変える。
560 :
デフォルトの名無しさん :2010/02/19(金) 01:59:05
>>599 あれ??エラーなくなりました。ありがとうございます。
しかしなぜなんですか???????
>>558 VS2008 はよくわからんが、C99 未対応コンパイラはブロックの先頭でしか
変数宣言できないぞ。
VC++2008はC99に対応してないし、VC++2010でも対応しないんじゃなかったっけ
error C2275: 'TCHAR' : illegal use of this type as an expression しかられたヤシ
# include <stdio.h>
int main(void)
{
int array[10];
int i;
for(i = 1;i <= 10;i++) { /* for文の始め */
printf("%d 個目の数値を入力してください。:",i); /* 数値の入力部分 */
scanf("%d",&array[i]);
}
for(i = 10;i >= 1;i--) { /* 10個の数値を逆に表示 */
printf("%d\n",array[i]);
}
return 0;
}
http://homepage3.nifty.com/mmgames/c_guide/13-q.html#S7 このURLにある練習問題の[3]
「入力された10個の数値を最後から表示するプログラムを作成せよ。」
という問題を解いてみたのですが、コンパイルするとエラーおきます。
なぜなのでしょうか?
int array[11]; 配列の要素は要素番号0から始まる。
>>565 エラーが出なくなりました。ありがとうございます。
エラーの原因ですが、array[10]としてたせいで、
array[]でできる変数がarray[0]〜array[9]までしかできず、
array[10]を表示しようとしてエラーが起きたと考えていいのでしょうか?
array[10]にscanfしたのが原因で '}' で戻れなくなった。
今日は、今時scanf使用の練習問題が有ることに驚く日
scanfの問題点はともかくとして、最近のC教習本とかでは scanfは出てこないの?いきなりfgetsとか使ってたりするんか
570 :
デフォルトの名無しさん :2010/02/19(金) 21:11:43
scanfの詳細にこだわる必要性はあんまりないが scanfを回避するにあたっての困難性をきれいに解決した例をまだ見ない
>>568 危険なパターンさえ回避しておればいいのではないかと。
fgets() ↓ sscanf()
>>572 scanf() で安全な場合もあるのですが。
%sはもう教えなくていい
cin >>
>>571 ほんとうに習い始めの数行くらいのコードでしか使えない。
それ以上のちょっと複雑な処理になると、ほとんどの初心者がはまる。
トラブルの回避方法とかscanf()の細かい挙動なんて学習しても
時間のムダだから、最初から使わないほうがいい。
こまけぇこたぁいいんだよ というAAが思い浮かんだ
579 :
デフォルトの名無しさん :2010/02/20(土) 03:13:01
sscanfでも許さない
うん。同意。
>>580 ポインタがどこを指しているのか分かりません><
>>581 64bit整数にキャストしてその値をprintfすればどこを指しているか白日の下にさらされるであろう。
ポインタで、配列でのアクセスのようにp[1]とするのは、C的にはアウトなのでしょうか? *(p+1)とすべきなのでしょうか? int a[10] = { 0 }; int *p = a; printf("%d", p[1]);
>584 いいえ いいえ
>>583 printf("%d", (long long)580);
こうでいい?
%pってスタンダード?
>>588 long longだから、%pでもない。
sjisをUTF8のURLエンコードする方法を教えてください unix環境です
>>591 サンクス、うまく行きました、感謝です
でもこれiconvしたあとでURLエンコードもいるんですね
ガウスなんたら法とか、わけわかんねー数式じゃなくて 単純な三角形の面積やら 二次方程式の解やら 数列の和やら 美籍やらを求めるアルゴリズムと、解説とサンプルコードを書いた 数値解析入門系のサイトをおしえてくりゃれ
ふつーに数学やればいいのでは?
C関係ないじゃんw
そういう簡単なものを自分でCで書くのが勉強になると思うんだが。
思うかもね
学問に王道なし
char hoge[4]にint hogehogeの数値を代入する方法はありますか? hoge[0]=hogehoge&0xff000000; hoge[1]=hogehoge&0x00ff0000; … 以外でお願いします。
memcpy(hoge, hogehoge, 4);
(int)hoge=hogehogeって、できるかも もしくは、共用体を使う
memcpyに3票
できるかも、はぁ? キャストしたのがL-valueになるのか いつの時代の話だよ
リトルエンディアンかビッグエンディアンかの考慮は?
>>577 そうですか。scanf("%d", &n) くらいは便利なんですがね。
エンディアン考えろよに一票
エンディアンはこの場合、あんまり関係無いような
ただエンディアンって言ってみたかっただけに一票
エンディアン言いたかっただけとちゃうんかい!
わざわざバイト毎に保存したいってことはエンディアンに依らないようにしたいんじゃない?
> hoge[0]=hogehoge&0xff000000; > hoge[1]=hogehoge&0x00ff0000; これを忌避する理由を述べよ。条件後出しは断る。
まあ602がエンディアンをまったく知らないとしたら エンディアンというものがあるということを教えるのは 良いことかも
>>593 だが
お前らそういうなら
微分・積分のアルゴリズムを書いてみろよ
ほら、はやく。どーせかけないんだろ?
わかってもいねぇ奴が人を腐して偉そうにしてんじゃねぇよ
ほら、書けるもんならかいてみろwwwwwwwwwwカスwww
区分求積法?
ゆとりは被害者だよ
ネタは他でやってください。
>>615 …俺なら、何がどうあってもそれは避けるよ。0固定とかいやだし。
>>593 が言ってるガウスなんたら法というわけが分からない数式が、ガウスジョルダン法のことなら
もう何も言うまい。それがアルゴリズムそのものだろ…
だからよー 美籍なんか、紙で書いたら2乗だのを前にだすだけじゃねぇか それがなんでガウスなんとか見たいな、わけわかんねーのになるんだよ 求めてるんはそんなんじゃねぇんだよ シンプルで分かりやすいもんを求めてんだよ あ?お前らみんなガウスなんとか理解してんのか?おい
ライブラリのソース読むのが手っ取り早い。
>>625 ねえ、まず学年を教えてくれない?ちょっとあり得ない事言ってるんだけど
>>627 うっせーよ
答えも出せないんだろ?お前は。いらねーよカス
2乗だのを前にだすだけで三角関数や対数関数も出来るわけ? 微分の定義習ってないの?
>>625 >あ?お前らみんなガウスなんとか理解してんのか?おい
自分が世間的にどの程度のレベルなのかを理解することは大事ですよ。
これは数学云々だけの話じゃなくて、たとえば
>単純な三角形の面積やら
底辺と高さから求めるのか、或いは3点の座標から求めるのか、
そういうことすら想定してないでしょう?
解析的にとける問題なんか、どうでもいい。
>>615 >> hoge[0]=hogehoge&0xff000000;
>> hoge[1]=hogehoge&0x00ff0000;
> これを忌避する理由を述べよ。条件後出しは断る。
オーバーフローするから
シフトしねぇとな
unionを知らないとみた
ファイルに書き出したいとか通信したいとかってことで char[4]にしたいなら、memcpy()とかunionじゃないほうがいいよな。
意表を突いて、実はこうなんじゃね? sprintf(hoge, "%d", hogehoge);
>>633 >char hoge[4]
が見えんと申すか。
>>631 そうそう、解析に解けない楕円積分とかを数値積分することに計算機の意味がある。
>>638 どういうこと?
char c = 1000;ってやるとなんかまずいと思ってる?
あと、unionでどうにかしようと思ってる人は間違いだ
642 :
デフォルトの名無しさん :2010/02/21(日) 22:51:55
C言語って何に特化された言語なんですか?それとも汎用なんですか?
UNIXというOSを作るのに特化されていたかもしれない
>>641 その心は?
hoge[0] = n & 0xff0000; とかやっても、値が入らないんじゃないかって
ふつーに思うんだけど。
CHAR_MAXが255とは限らないって話?
645 :
デフォルトの名無しさん :2010/02/21(日) 23:05:28
>>641 つまり、union は同時には使わない変数の記憶域節約にのみ使えと?
647 :
デフォルトの名無しさん :2010/02/22(月) 00:18:48
>>646 機種依存を百も承知のコード(ドライバとかね)を、
そうであることに十分に意識して注意深く記述というのはよくある話で、
アセンブラやニーモニックコードを持たない機械語とのやりとりにあたっては
「保証」はある範囲で存在すればよいことなので一般論にはあてはまらない
でっていう
なにいってるかよくわからない
リトルエンディアンの時 uint32_t hogehoge; uint8_t hoge[4]; hoge[0]=hogehoge%256; hoge[1]=(hogehoge/256)%256; hoge[2]=(hogehoge/256/256)%256; hoge[3]=hogehoge/256/256/256;
>>467 は大層な書き方してるけど
単純に共用体使ってバイトごとのデータをとるのは
よくあるコードだ、てだけじゃないの?
他の分野じゃ知らんが、通信系じゃ普通のことだよ。
union { uint32_t DWORD; uint8_t BYTE[4]; } hoge; uint32_t hogehoge; hoge.DWORD=hogehoge;
>>652 の言ってる通り。
>>641 もunion使ってるプロトコルスタックを使って、
偉そうにunion使うなと書いている。
いつもは規格にうるさい住人もこれに関してはゆるいんだな 処理系でどう定義されてるかを認識した上で使うなら問題ないってこと?
unionを使ったことないから
これでどう? 冗長? int n = 1; if( *(char*)&n ) { hoge[0] = ((char*)&hogehoge)[3]; hoge[1] = ((char*)&hogehoge)[2]; hoge[2] = ((char*)&hogehoge)[1]; hoge[3] = ((char*)&hogehoge)[0]; } else { memcpy(hoge, &hogehoge, 4); }
char str[] = "abc\ndef"; とすると abc def となってくれるのですが smpl.txtに abc\ndef と書いて読み込み→表示としても abc\ndef となってしまいます ファイルから読み込んで改行するにはどうすればいいですか? 配列一つでなんとかしたいです
fscanf とか fgets は1回の読み込みが、改行文字単位での処理区切りになったりする fread 使ったら?
あー "\n" という文字列を 改行コードに置換する話だったのか…
ありがとうございました うまくいきました
うまくいきましたから、今日はカレーを食べますね
>>655 甘いっつか、intの値をcharの配列に入れる時点で
処理系に依存せざるを得ないからなぁ・・・
>>664 エンディアンさえ正しく認識してれば問題ないと
>>658 #include <stdio.h>
#include <stdlib.h>
int main(void){
return printf(fgets(malloc(256),256,fopen("sample.txt","r")));
}
>>666 echo 100%dry-fruits > sample.txt
>>666 \nを改行だと解釈するのはprintfじゃないよ。cコンパイラ。
えぇー
文字列中の単独の¥(未定義のエスケープキャラ) はどのような扱いを受ける?無視?それともエラー? 警告?
くっはーw
文字列中の単独の\ は、実行中はただの\
>>670 文字列と文字列リテラルの区別がつくようになれよ
実行中に警告を出してくれるライブラリは少ない 単独の¥を¥として扱ってくれるコンパイラも少ない ¥¥としないと¥としては扱ってくれない
はあ?
文字コードを正しく使えない奴が語るな。
だから プログラム記述中に登場する \ と(リテラル)、 メモリ上でのイメージでの \ (0x5c) を区別しろって。 dll なんかのバイナリコード中の 0x5c を変換されたらカワナン
まあ初心者にありがちな勘違いではある。 このスレ向きかもな
いつも\と¥が化けるのが気になる。
コンパイラはソースコード上の文字列 "abc¥¥cde" を見るとこれは"で始まっている"で終わっているから 文字列リテラルと呼んでる奴だな と判断し文字列リテラル中の連続する¥¥は 単独の¥であるがごとく解釈する 連続しない¥が現れた場合¥nなどのように 後ろの文字によっては別の文字に置き換えて 解釈する場合もあるが殆どの場合は警告を出して スキップする。 "表¥計算"とかが警告だされるどころかそれまで 出ていた警告が逆に消える理由は表という テキストエディターでは漢字に見える文字列は コンパイラは実は2つ(以上の)の文字列でしか なく偶々その後ろの文字が¥に一致していたから
×>コンパイラは実は2... ○コンパイラにとっては実は2...
\じゃなくて¥と書かれているあたりがなんかやらしい。
それMac版の\?
>>683 バックスラッシュを円記号に変換する2ちゃんねるブラウザ()が
あるらしいですよ?
俺のブラウザでは・(中点)に見える。
Cでパスとか何回か記述しているときなんかは perlの''とかC#の@""とかが恋しく思うときがある
パスなら/で通るようにできてるだろ。 MSでも
普段は、windows でも / をセパレータとして使ってるなあ \\ は見づらいし
ほぼ初心者の状態から ・メモ帳から200個の数字を読み取ってその平均値を出して、またメモ帳に書き込む というプログラムを作れるようになるにはだいたい何日くらいかかりますかね?
2日
>>692 リアルメモ帳上の20個の3桁の整数値の平均を出せるように
なるまで個人差、環境差、状況差もあるが産まれてから10年
程度じゃまずムリと考えたほうが良さげ
200個10桁ともなれば30年経っても無償でやれる人は
殆ど居ない
200個100桁ともなると例え有償でも手計算でノーミスで
やれる人自体皆無になる。
(Windowsアプリ「メモ帳」のメモリ内容を書き換えるなんて
操作取得までの時間なんてきかないほうがよい)
C言語でテキストファイルから200個の数字を読み取り平均値を
付け加える処理の記述が自然にラクに出来るようになるまでの
時間もきかないほうがいいが,Windows環境というのであればWSH
処理系を選んだほうがやや速いのではないかと
Window列挙して、「メモ帳かどうか」、「タイトルは何か」、で窓を特定して
Ctrl+Aなげて全選択してCtrl+C投げてコピって
数字だけ拾い出して平均値出して、それをまたメモ帳にSetWindowTextすればいいんでね
以上のことを調査で1日作業で1日予備で1日で3日
>>694 なにこれ?
手計算ってなに?手計算でやるプログラムってどう誤読するとそうなるんw
生まれてからって何? 692の言っているのは初心者からであって、誕生からではなくね?
ボケに対する突っ込みはもっとスマートにやっていただきたい。
初心者から3日でできるわけが
3日もかけるの?
一日どのくらい勉強するかによるけど、3日あればそのくらいのプログラムは 作れるようになるんじゃね
それをやるために必要なことだけを学習すれば早いだろうけど、 基礎から順番に習っていってそれができるまでに要する期間となると、結構かかるかもね
できるって言ってる人とできないって言ってる人の 想像する「初心者」がまったく違うと思われ
言語は初心者 + OS周辺も初心者 言語はできる + OS周辺は初心者 言語は初心者 + OS周辺は経験あり
土日潰せば出来るよ
初心者じゃなくておまえらならどんだけかかるんだよ。
メモ帳のプラグイン?
まったく、エラー処理もしていないし メモ帳にカンマ区切りで数字のみ並んでいてかつ、メモ帳が1個しか起動してないなら そしてメモ帳に書いてある事は消えるけど つか保存して読み込んだほうがよくね? そうすればよくある初心者むきのプログラムだし int i=0; int count=1; HWND np,npe; np=FindWindow("Notepad",NULL); npe=FindWindowEx(np,0,"Edit",NULL); SendMessage(npe, WM_GETTEXT, sizeof(str), (LPARAM)str); p = strtok(str,","); i += atoi(p); while(p = strtok( NULL,",")){ i += atoi(p);count++; } i /=count; sprintf(str,"%d",i); SendMessage(npe, WM_SETTEXT, 0, (LPARAM)str);
>>692 はメモ帳で作ったテキストファイルの読み書きをしたいだけの気がするのは、私だけ?
708 :
707 :2010/02/24(水) 00:10:34
正確には、メモ帳で作成して"保存済み"のテキストファイルの読み書きかな。
その質問に関しても答えがまだ出てないだろ 何せCの文法やライブラリすら完全に固まっ てるというわけでもないんだからよ
Cの文法やライブラリが固まってなければみんな困るだろw
>>692 のやりたいことが固まってないだけだw
中央値を求めるにはソートしてから真ん中の要素を取るしかないでしょうか? それ以外に方法はありますか? お願いします。
ソート以外にも方法はあるけど、一番分かりやすくて単純なのはその手法だと思う まぁ「中央値 アルゴリズム」でぐぐれば山ほど説明がでてくる気に入ったの試してみたら
こういうのはアーキテクチャーやデータ構造、そして状況依存な 話ですので、一般論は差し控えたいものですなw コンテクストを教えて頂かなければ答えられません。
データの並び替えすら禁止されている状況もありますね
本物を並べ替えなければばれないよ
>>708 SendMessageでファイル保存ダイアログ開かせて適当なファイル名をWM_CHARで送ってボタンのハンドルにlbtndown送って保存させて、
それを開いて読み込んでって感じに706を改良すれば委員じゃね?
本物に対してポインタが定義されていても、一時的である ケースもありまつ(次のアクセスまで有効かつ次のアクセス時 に必須)(列挙において常に順序が変わります) そして本物のデータの一個一個がかなり巨大なので 全部を配列にコピーして記憶も無理です
>>712 ありがとう。いろいろ調べてみます。が、難しそうですね。
いいえ。多くの場合は整列して中間の値を取る
だけでよくてつまり簡単のではないかと ....
>>715 のようなひねくれたケースに限っては
中間値を求めること自体に意味があるケース
は殆ど無いのではないかと思われます。
722 :
デフォルトの名無しさん :2010/02/24(水) 21:15:45
>722 他は見てないけど 96行目が怪しい if(position[0] = '\0'){
724 :
707 :2010/02/24(水) 21:43:39
>>717 もっとC言語の入門的な既に保存済みのhoge.txtをfopenで開いて処理したいだけと想定しました。
>>692 が答えてくれないと正解は分かりませんけど。
>>723 位置も種類も当たった文字数が0の時、種類のみ当たった文字数を
カウントする部分なんですが、試しに消したら余計におかしくなりました・・・
>>727 あ、すみません「==」の間違いでした
直しましたがやっぱり文字数が合わない時があります
>conjecture[i] = buf[i] - 1; この-1ってなんですか?
>>729 最初文字列の読み込みの仕方がよくわからなかったので、とりあえず大学のプリントを
真似しようと思って読み込み部分はコピペしてます
元はfgetsで読んだ文字列に対して、各文字コードが1小さい文字列を配列に作るプログラム
(の一部)みたいです
-1消しても変わりませんね・・・
>>722 は大学の課題です
たぶん bufとかsecretを初期化して無いからとかじゃね 一回ごとにmemsetで0詰めるとかすればいいと思う
char secret[BUFLEN],secret2[BUFLEN], conjecture[BUFLEN]; int i,f,len,n,n1,n2; memset(secret,'\0',sizeof(secret)); memset(secret2,'\0',sizeof(secret2)); printf("秘密の単語は? "); fgets(secret2, BUFLEN, stdin); secret2[strlen(secret2)-1]='\0'; len = strlen(secret2); printf("秘密の単語は %d 文字です。\n", len); n=0; while(1){ strcpy(secret,secret2);//secretはいじるのでおおもとかっらコピって使う printf("類推した単語は? "); memset(conjecture,'\0',sizeof(conjecture)); fgets(conjecture, BUFLEN, stdin); conjecture[strlen(conjecture)-1]='\0'; if(!strcmp(conjecture,secret))break; n1 = 0; n2 = 0; for(i=0;i<len;i++){ //位置も値も同じ if(secret[i]==conjecture[i]){ n1++; secret[i]=conjecture[i]=NULL;//カウントアップして見つけた所つぶす } } for(i=0;i<len;i++){ //位置違い for(f=0;f<len;f++){ if(secret[i] && conjecture[f]){//つぶしたところはやらない if(secret[i]==conjecture[f]){ n2++; secret[i]=conjecture[f]=NULL;//カウントアップして見つけた所つぶす }}}} printf("位置も種類も当たった文字数は %d 、種類のみ当たった文字数は %d です。\n",n1 ,n2); n++; } printf("%d 回で当てました!\n", n);return 0; }
あ、positionとkindの0番目にNULL入れる位置2つあるし、片方消しても動くなぁ とりあえず完成したからよしとしよう・・・
735 :
デフォルトの名無しさん :2010/02/25(木) 14:14:06
ソートプログラム選択法が 上手く動きません。 do { flag=0; for(j=i+1;j<9;j++); { if(msort[i]>msort[j]) { work=msort[j]; msort[j]=msort[i]; msort[i]=work; flag=1; } } for(k=0;k<10;k++) { printf("%4d", msort[k]); } printf(" \n "); i++; }while(flag==1); 下方のprintf関数はスルーでおk 配列に入ってる10個の数値から、最小値を見つけて見つけたら入れ替えを 繰り返して昇順にソートするプログラムです。 何かおかしいところあったら教えてください。
少し前まで正常に動いていたプログラムがmallocのところで セグメンテーションフォールトで落ちるようになってしまいました。 確保しようとするサイズも16バイトと小さいです。 どのような原因が考えられるでしょうか? (gdb) bt #0 0x00002b186539ad03 in mallopt () from /lib/libc.so.6 #1 0x00002b1865399ff7 in malloc () from /lib/libc.so.6
少し前まではまぐれで動いていた。
なるほどわかりました。解決しました。ありがとうございました。
>>735 do〜whileをやめて
for ( int i = 0; i < size; i++ )
{
for ( int j = i + 1; j < size; j++ )
{
並び替え
}
}
じゃダメかしら
>>735 >for(j=i+1;j<9;j++);
あと、入れ替えが起きなかった場合に途中でソートが終了してしまう。
742 :
デフォルトの名無しさん :2010/02/26(金) 11:07:42
>>740 do〜whileは flag立てる為に使いたい
>>741 >for(j=i+1;j<9;j++);
for文にセミコロン入ってるwww
初歩的ミスでした。。。
セミコロン消して実行したら、問題解決しました!
>>740 >>750 ありがとう!
そのフラグを立てるってやり方がおかしい。 たとえば先頭にたまたま一番小さい値が入ってた場合、 ソートは全くなされない。
744 :
デフォルトの名無しさん :2010/02/26(金) 12:42:06
あぁ、ここには書いてないが、一部をもってきた。 フラグを立てて整列されたかを判断。 そのたびに、一回目、二回目・・・と出力するプログラムを作ってました。
746 :
デフォルトの名無しさん :2010/02/26(金) 12:50:19
河野氏はオーバーな表現でウケを狙う傾向が強いから 額面どおり読んじゃだめだよ
なるほど。 "do not use" が "must never use" になってるな。
>>746 ,748
だから何? char x = NULL とかしていいとでも言うの?
いいよ
Nがすごく大きいとき、(1<<14とか) mainの外で double a[N][N]; とすると、(時間はかかるけど)領域確保できるのですが、、 mainの内で同じ式を書くと Segmentation fault になってしまいます。 なぜですか?
表現はオーバーかもしれないが、ダメなものはダメ。
予想される解答 「グローバル変数にした場合、プロセスファイルに その情報が書き込まれ、領域確保はシステム状態 を熟知しているOSがより洗練された方法でプロセス 実行前に行い失敗する限りプロセスを開始しないから 失敗しようがない。 ローカル変数にした場合能力が本質的に低く 単純だが速度が速い方法でプロセス自体が領域を 確保を行うから失敗する。」 ↑これ古い考え方だから多分不正解
>>751 環境によるけど、たぶんスタックが足りないから。
なるほど。 たしかにmainの内でも、 static double a[N][N]; にしたら確保できました。 ありがとうございました。
>>750 バカだなあ、と思われても構わないならいいけど。
>>756 どういう点でばかだなぁと思われると思っているかによって評価が変わるレスだな
質問なのですが、定数NULLの型って、何でしょう? 手元のコンパイラ(bcc)ですと、以下のようになっているのですが、C++とCでは NULLの型が違うということ? # if defined(__cplusplus) || defined(_Windows) # define NULL 0 # else # define NULL ((void *)0) # endif
c++では void *と他のポインタはコンパチではないので、比較、代入できない。 関数プロトタイプは省略出来ない。 従って0を使う。 Cでは void *は他のポインタとコンパチ、比較、代入できる。 関数プロトタイプはオプション 従って(void *)0を使う。
>>759 情報どうもです。少し難しくて微妙に理解できないので、もう少し
勉強してからまた来ます><;
C++は型チェックが厳密と聞いていたのですが、ポインタにスカラー値を
直接代入できるとか、曖昧な点もあるのですね。メモメモ・・・
>>759 関数プロトタイプと 0 の関係についてぜひ教えてください。
定数0だけ特別。 定数0と等しいポインタはどこも指していない(ヌルポインタ)。 定数0が代入されたポインタはどこも指していない(ヌルポインタ)。
関数プロトタイプが無いと、引数に0が与えられるとデフォルトでintと解釈される。 sizeof(int) != sizeof(void *)の時に破綻する。
>>762 ヌルポインタの実装上の表現が 0 と同一とは限らない点に注意。
どこで聞くべきか迷ったのでここで聞きます。 モジュール分けしてファイルを分けた時に、 例えば main.c calc.c output.cと分けたとして、 calc.cでしか使わない構造体とかの定義ってcalc.hに書きますか? それともcalc.cの先頭につらつらと書きますか?
>>769 ヘッダファイルにするのは、記述内容を複数のコンパイル単位で読み込むため、と限定して考えるのであれば、
> それともcalc.cの先頭につらつらと書きますか?
の方を私はとります。
771 :
デフォルトの名無しさん :2010/02/26(金) 21:34:44
int Count = 0; if (count ==100){ Printf ("売り切れ\n"); } else{ count ++; } 本から抜粋なんだけど何を基準に int Count;とint Count=0;を使い分けてるの?
その本を今すぐ投げ捨てるんだ。
773 :
デフォルトの名無しさん :2010/02/26(金) 21:57:45
正直破り捨てたいけど図書館から借りた本だからな… プログラミングの本なのにカレーの作り方とか載ってるからね…
>>759 C++ でも void* との比較はできる。
(void*)0 は C では特別ルールで 0 と同様にヌルポインタ定数として働くが、
C++ にはこの特別ルールは無いというだけ。 void* から他のポインタに
暗黙変換が効くこととは直接関係ない。また、 C で NULL が 0 と定義されて
いてもなんら問題は無い。
>>774 null pointerの内部表現が0ではない、かつ、intに収まる環境だったとして
char *p = 0;
int int_p = p;
とした場合、
int_p == 0 は偽になり、int_p == (void *)0 は真になるのではないかと思ったがいかがか
>>775 ポインタ型から整数型に変換した場合の結果について、標準ではほとんど
何も定められていない。定められているのは、 void* から (u)intptr_t に変換して
それをさらに void* に変換した場合は元の値に戻る、ということだけ。
従って2つの比較の結果について標準の範囲で言えることは何も無い。同じく
標準の範囲ではそれらの比較結果にヌルポインタの内部表現は関係ない。
まぁわざわざこれらの変換の際にビットパターンをいじらなければ標準で
定められた動作は達成できるんで、たいていの環境では思ったとおりの結果に
なっちゃうだろうね。
まぁ
>>759 で大体あってるよ。
intとポインタで内部表現やビット幅が違う場合とかで、
NULLの定義が0だと問題になることがあるんだ。
>>774 で言うような特別ルールは無かったと思うよ。
身近なところでは、8086のnull pointerは0じゃない場合がある。
NULL != 0 だが 0==NULL じゃなかったかな
>>777 > NULLの定義が0だと問題になることがあるんだ。
ねーよ。
>
>>774 で言うような特別ルールは無かったと思うよ。
あるんだってば。
ISO C 6.3.2.3 p3 より。
> An integer constant expression with the value 0, or such an expression
> cast to type void *, is called a null pointer constant.
C++ には "or such an expression cast to type void *" のような部分が無い。
8086だけが特殊なの?
>>782 わざわざ内部表現に依存するようなコードを書かなければ特殊でもなんでもない。
内部表現に依存するようなコードはすべて未定義や実装依存や不定な動作になるんで、
基本的に書くべきではない。
せっかく C 使ってるのにそんな環境ベッタリなコードが必要になることなんてあるの?
ANSI Cからは外れてるので、忘れてくれ。
何を忘れろって?誰だよおまえ。
>>784 > せっかく C 使ってるのにそんな環境ベッタリなコードが必要になることなんてあるの?
Cで書く時は、環境べったりなコードだらけのことが多いだろ。
LSI C すら ANSI 準拠だというのに、「身近なところでは」とか言いながら どんだけ昔の話をしてたんだ?
>>787 で、どんな時にヌルポインタの内部表現に依存するようなコードが必要になるの?
near pointer と far pointerを混ぜて使うといろいろ不思議なことが起こる。 32bitのWindowsなら、8086で書いたプログラムも動くだろ。
LSI CはANSI 準拠では無いと明言してなかったっけ?
>>789 メモリのオフセット0にアクセスするとき。
組み込みです・・・
組み込みです・・・・・・
まぁ本題には関係ない気もする。
試食版の4.1.1 言語仕様にはANSIとの相違点が列挙されてるな どこまで仕様にそってればANSIと名乗れるんだろうか
>>793 8086だと、ANSI Cに準拠したコンパイラでも、ANSI C準拠のオプションをつけてコンパイルすることはあまりないよ。
>>795 試食版には「ANSI C準拠のオプション」とかいうやつは見当たらなかったんだけど、
製品版にしか無いものなの?
>>774 一行目はその通り。
Cで#define NULL 0ではダメな理由は解説済み。
>>764 に反論しろ。
>>759 は↓このように訂正
------------------------------------------------------
c++では
void *と他のポインタはコンパチではないので代入できない。
関数プロトタイプは省略出来ない。
従って0を使う。
Cでは
void *は他のポインタとコンパチなので代入できる。
関数プロトタイプはオプション
従って(void *)0を使う。
------------------------------------------------------
>>796 8086のCコンパイラはnearとfarが予約語になっている。LSI-Cはあったか定かでないが、Turbo Cにはこういう拡張を使わないオプションがある。8086でそれなりの大きさのプログラムを作るときは、これを使わないというわけにはいかない。
>>797 それだと、Cでは(void *)0を使うべきって見えてしまう。
CもC++もNULLポインタは 0でいい
特殊な場合にプログラマがポインタであることをキャストで
示さないといけないけど、あくまでそういう場合もあるってだけ
>>799 > それだと、Cでは(void *)0を使うべきって見えてしまう。
そう言っている。それで不都合は無い。
一方そうしなかった場合の不都合は既に述べた。
個人の主義の主張は別に構わないけど、あれだと一般論のように見える
一般論だから標準インクルードファイルで #define NULL ((void *)0) されている。
http://www.kouno.jp/home/c_faq/c5.html 見ると、#define NULL ((void *)0) は「ポインターの内部表現がどんなデータ型
でも同じマシンに限られる」って制限が付いてるから。ポインタの内部表現が
データ型によって異なる環境が存在することを考えると、広義(一般論)としては
((void *)0) より 0の方が適当な気がするが、チガウ?
NULLを使えばいいだろw
NULL使えや その方が読みやすくていいやんけ
C FAQ 的には「0つかえや」
ただし関数のプロトタイプ宣言してね。あと可変長引数ではきゃすとしてね。
>>806 「どうでもいい」がC FAQの立場だろ
8086 の話がでているが、 sizeof(void (*)()) != sizeof(void *) のことは挙がってきていませんね。問題だとはおもうのですけどね。
>>803 ある型のヌルポインタは別の型にキャストしてもヌルポインタであることが保証されているはず
>>809 それが、現実場面で問題になる場面が思い浮かばない。
多分
>>809 が言いたいのは、
「NULLポインタは 0 でなく (void *)0 にしろ、そうすればキャストが要らなくなる」
って言う人がいるけど、コードとデータでポインタサイズが違う場合は
やっぱりキャストが必要だよね?これ問題じゃね?
程度の差はあれNULLポインタを 0 で書くのとたいして変わらないんじゃね?
ってことですかね
0 と書くのが正統、NULL は邪道
815 :
809 :2010/02/27(土) 16:50:29
>>813 実のところ、コンパイラは賢いから普通に書いていて問題になることはないでしょうね。
ちゃんとプロトタイプ宣言して可変長引数に注意しておれば。
by Linus C
>>797 (
>>764 )
(void*)0 でもプロトタイプが無い場合に sizeof(void*) != sizeof(T*) であれば破綻する。
実際に 8086 で関数ポインタを受け取る場合が該当するようだね。(
>>809 )
つまりプロトタイプが無い場合には 0 でも (void*)0 でもキャストが必要。
正しい対策は C FAQ にあるとおり。
> 「0」や「NULL」を関数の引数に使うときは、呼ばれる側の 関数が想定しているポインター型にキャストしろ。
void* ではなく「呼ばれる側の関数が想定しているポインター型」にキャストしないといけない。
この対策は NULL が 0 でも (void*)0 でも変わりなく、
>>764 は「Cで#define NULL 0が
ダメな理由」とはならない。
プロトタイプが無い場合 #define NULL 0 sizeof(int) != sizeof(void *) の時に必ず破綻する #define NULL ((void *) 0) sizeof(int) != sizeof(void *)かつ、sizeof(void *) != sizeof(type *) になるtype *を引数に持つ関数の時に破綻する。 お前が必死に屁理屈こねても標準インクルードは変わらない。
>>818 屁理屈でもないし、誰も標準インクルードを変えろなんて言ってない。
C FAQ でずーっと昔に答えの出ているところにいまさら
>>797 にあるような迷信を
偉そうに吹いてまわられては迷惑なので正しい情報を提供しているだけのこと。
> #define NULL ((void *) 0)
> sizeof(int) != sizeof(void *)かつ、sizeof(void *) != sizeof(type *)
> になるtype *を引数に持つ関数の時に破綻する。
sizeof(int) == sizeof(void *) でも破綻するよ。
>>818 関数プロトタイプはオプションといつまでも昔の仕様を言い続けるのもやめてくれ
>>820 オプションてのがどういう意味なのかイマイチ分かんないけど、
今の規格でもプロトタイプ宣言は有っても良いし、無くても良い。
>>819 迷信でも何でもない。Cにおいては
#define NULL 0は
#define NULL ((void *)0)
に劣るから((void *)0)が採用されている。
お前は((void *)0)が0より劣る事を示せない。(無いんだから示せるわけが無い)
>>820 昔の仕様じゃなくて現在の仕様でも、オプションなんだが。
文句があるなら標準化機構に提案して、サクッてくれ。w
>>822 #define NULL 0 が #define NULL ((void *)0) に劣るなんていうのは、
プロトタイプの無い関数の引数や可変長引数にキャスト無しで NULL を
渡せると信じている無学なプログラマにとって、且つ、ポインターの
内部表現がどんなデータ型でも同じマシンに限って、の話でしかない。
だれも((void *)0)が0より劣る事を示そうなどと考えていないし、示す必要も
ないが、こういう誤解を広める元になっているという点で劣っていると言える
かもしれない。
>>823 C99 で関数の宣言は必須になったかもしれないけど、プロトタイプは必須になってないよ。
>>823 残念ながらC99でも違反じゃないんだ。出直しといで。
>>824 劣って無いのだから示せるわけが無い。残念だったな。
>>826 繰り返すが、だれも((void *)0)が0より劣る事を示そうなどと考えていないし、
示す必要もない。従って残念でもなんでもない。
#define NULL 0 でも #define NULL ((void *)0) でも、正しい知識を持ち、
無駄に移植性を失うようなコードを書かないプログラマにとってはどちらも同じ。
どちらが劣るということは無い。
>>827 無駄。無駄。無駄。無駄。
#define NULL ((void *)0)
これが現実であり、全て。
>>828 お前の使ってるコンパイラでそれが現実であり全てであることに
ケチをつけるつもりは無いんだけど、他のコンパイラでも同じであるかの
ような根拠の無い主張を繰り返すのはやめてくれ。
初心者が見て「じゃあ可変長引数に渡すときのキャストは要らないんだ」
なんて思われては困る。
>>828 お前も((void *)0)が0に勝ってる点を言えてないが。
代表的なのCでそうなってるからそっちの方が優れているに違いない、
という論旨?
そもそも #define NULL (void *)0 なんて環境あるの?
ANSI以前の昔はあったらしいけど、
>>828 はどういう環境なんだろう
今手元にはcygwinしかないけど、#define NULL 0 になってるし、
Solarisも同様だったはず
#ifndef NULL # if defined(__cplusplus) || defined(_Windows) # define NULL 0 # else # define NULL ((void *)0) # endif #endif
834 :
デフォルトの名無しさん :2010/02/28(日) 00:17:18
void * がない C では char * で代用してた
>>830 C では (void*)0 のほうが好ましいのは確かで、整数 0 を意図している箇所と
区別できることにより
>>732-734 のようなコードに対して簡単に警告を出すことが
できる。
先日からがんばってる人が言っているような、型が不明な引数に正しいキャスト
無しでも渡すことができるようにするため、などという理由では無い。
∧,_∧ ♪ (( ( ) ♪ / ) )) なーんだ♪なーんだ♪なーんだ♪ (( ( ( 〈 (_)^ヽ__) ♪ ∧_∧ (´・ω・`) )) (( ( つ ヽ、 NULL♪NULL♪NULL♪ 〉 とノ ))) (__ノ^(_)
>>832 Windows Cプログラミングだと (void*)0 でなくて 0 なのは何で?
C言語にスコープ解決演算子ってありましたっけ?
ないよ。
>>830 とっくに言っている。優れているから採用されている。
>>835 他の理由があっても否定する理由にはならない。
>>840 まず1点だけ確認させてください。
NULL を ((void*)0) と定義したところで、可変長引数やプロトタイプの無い関数の
引数にキャスト無しで渡した場合に問題が発生する可能性は無くなりませんよね?
問題が発生しなくなる場合もある。 問題が発生する場合には、0でも発生する。
NULL を意図しているなら NULL と書けばいい キャストが必要ならキャストすればいいじゃん
>>842 「問題が発生しなくなる場合もある」ということですが、可変長引数やプロトタイプの無い
関数の引数にキャスト無しの NULL を渡しても良い場合、というのがあるのでしょうか?
あるとすれば、それはどんなときですか?
>>844 条件はこのスレで出ている。お前の負け。
____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ お前の負け。 | |r┬-| | \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwwwwwwwww | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / バ | | l||l 从人 l||l l||l 从人 l||l バ ン ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
>845 答えられないのに偉そうに 規格書のセクション書いてくれ(キリッ
真アホウに煽るアホウ
今度は裸の王様作戦できたか。
ポインタ無しでもC/C++使えますか? ポインタが無いとダメな例を。
手足を縛ってプログラム書くくらいなら最初から手足のない言語を使え。
C言語のみの仕事ってあるの?
探せばいっぱいあるだろ 組み込みとかデバドラとかソケット通信とか
856 :
デフォルトの名無しさん :2010/02/28(日) 16:04:04
>>852 main()
{
printf("Hello, C world!\n");
}
>>852 データ構造を考えなくてはならないところでは、ポインタは必須ですね。
単純な線形リストにしても、ポインタなしでは考えられません。
>>853 のいうとおり、ポインタの必要ない言語はいくらでもありますので、それをお勧めします。
なんせポインタだけの本があるくらいだからな。 タイトルだけで中身見てないからどんなこと書いてるのか知らんけど。
たぶん、ポインタのことについて書かれてると思う
860 :
デフォルトの名無しさん :2010/02/28(日) 23:58:31
リストだって配列と添え字だけで作れば作れてしまうが ポインタを使うよりかえって難しくなるだけだぞ なんでそうまでしてポインタを避ける必要があるのか考えてみなって 結論より考えること自体が大事なことだ
ポインタ分からないのに配列分かるのかな
ポインタはわかっていてもやってしまうことがあるが、 添字をチェックする配列ならアプリが落ちるだけで済む。
864 :
デフォルトの名無しさん :2010/03/01(月) 00:13:56
>>861 ちょっとスレ違いだが BASIC の配列はポインタを知らなくても一応使うには使えるね
それはBASICの人が思ってる配列の役割とCの人が思ってる配列の役割(っていうかカバーする範囲)の差だわな
866 :
デフォルトの名無しさん :2010/03/01(月) 00:38:33
いみふ
Cの配列の参照は *(p+i) の短縮表記なので、ポインタと同じ。バッファオーバーランをやってしまう可能性がある。 他の言語では、たいてい配列の添字のチェックが入るので、実行時エラーですむ。
要するに言語的に欠陥ってこと? なんでこんな言語が未だに学校で支持されてるんだろうな
まず自分の頭を直せよ
実行時にチェックしてたら遅いじゃん
>852 メモリが無理なとき 馬鹿でかいサイズでもそのデータのポインタなら受け渡せる
872 :
デフォルトの名無しさん :2010/03/01(月) 02:28:26
ポインタのみの本があるのが理解できないw 最近はC/C++も人気なくなってマシになったが、15年くらい前なんて ポインタ○△×なんて本がC言語セクションにずらららららーーーっと並んでた。
void f(const char *string) { char *endOfString; endOfString = string + strlen(string); } と書いてgcc -Wall -ansiでコンパイルしたら warning: assignment discards qualifiers from pointer target type という警告が来た char *型とconst char *型って直接演算できなかったっけ?
演算というより、const char*なポインタをchar*なポインタには代入できない。 逆の代入は可能、同じconst char*ならいいのでendOfStringをconst char* にするべきか。
endOfString自体(ポインタの指す先ではなくアドレス)を書き換えるからchar *でなくては endOdString = (char *)filename + strlen(filename); ならおkだよね でもなぜ > const char*なポインタをchar*なポインタには代入できない
逆はできるよ。よく考えな。
877 :
874 :2010/03/01(月) 09:47:28
char * const endOfString; なら代入の左にできない。
あ、よく考えればfilenameをendOfStringにコピーする必要はないね const char *filenameはfilenameの指す先を変更できないけど、filename自体の値は書き換えられるから
最初にポインタあり言語を覚えた人=ポインタ当たり前・必須・便利 最初にポインタなし言語を覚えた人=ポインタ怖い・めんどくさい
それは違う。
881 :
鬼神の名無し :2010/03/02(火) 20:58:06
C言語の事詳しく教えてください!
>>881 宿題スレで突っ込まれながらコードを書くのが吉。
884 :
デフォルトの名無しさん :2010/03/03(水) 01:52:30
>>881 言語Cって言わないと、「そんなものは無い!」とかいってキチガイが飛んでくるぞwwww
885 :
デフォルトの名無しさん :2010/03/03(水) 03:08:44
>>881 とりあえず最新のC++/CLIでもいじってみ
とりあえず環境から揃えたいんだが、EclipseでCって使いやすいのかな? インストールと設定だけで大変そうなんだが
基本情報処理の為の午後の言語で悩んでる。独学です。 C言語にしようと思うんだが、JAVAも面白そうだし
去年の春から確か表計算が選択できるはずだから それが一番楽かもよ 個人的にはCが一番やりがいがあるとは思うけど
言語の仕様は、アセンブラの次に単純だから、早く習得したいならCかな。 ポインタにはまらなければ。
Cは教養、学びたいなら選ぶべき 単に資格取りたいなら889が言う様に表計算でもJAVAでもいいんじゃね
ハッカーを目指すならC 土方を目指すならJava
ハッカーも、職業プログラマなら業界のスタンダードな資格は 取得しているものなのでしょうか。
自分の言語の根っこみたいなものが、JAVAにあるとC#とかに行くのは楽だけど、その他に行くときにわりとやり直しになる 根っこがPerlとかだともっとつらい 人によってはPerlに閉じこもっちゃうくらい 根っこ作りをCでやっておくと、かなり自由に枝を伸ばせると思う C++やJAVAの機能でも「ああ、こうやって実現してるんだろうな」、とか「こう使うと便利だろうな」 とかってメカニズムに対する勘が働くし >スタンダードな資格は取得しているもの 資格が給料に意味を持つ会社と、まったく気にしない会社があるよ 資格持ってるやつを馬鹿にする社風のところもある(意外と技術力高いところに多い) どっちにしろ資格で仕事のできるできないは判断できないから、あくまで重要なのは本人の能力 クライアントが資格持ってるSEを入れろというなら資格持ってる新入社員を契約書上のリーダーにするなんて事もある 実際は何もできなくても
perlに閉じこもるとか気の毒すぎるだろ
IPAの情報処理の資格は持っててもいいんじゃね? 英語力がどーたら、TOEICが…とか言っているのはSE(システムエンジニア)だし。
TOEICが重要視されるかは知らんが、出来て当然な感はある
でもあれだよな いくらTOIECの点高くても、コミュ能力の低いプログラマ(結構多い)はやっぱ英語でも口下手だったりするよな 相手が女だったりするとさらに酷くなってみたりして なんでお前となりの席のアメリカ人とメッセンジャーでやり取りなんだよwwみたいなやついたもの
英語はツールであって、話す内容がなければ意味ないのは当然だろ プログラミング技術はあっても何を作る、何をするってアイデアが無いのと同じ
加えてTOEICはコミュ力なんて全く関係ないからな 英語の記事や本読めるだけで良い場合、いつまでたっても関係ない
> コミュ能力の低いプログラマ(結構多い) 同じプログラマや技術者に対するコミュ能力は高いんだがな。 誰だって、自分の属する文化内ではコミュ能力は高いのさ。 そして、異文化交流が下手なのはプログラマだけではあるまい。
んなことねーよ 誰とも口きかないし、しゃべても何いってるかわからん 女と話すときょどるやつの率は、他業種に比べて格段に多いと思う
それって、下っ端の話?
そりゃま、だれかの上司には成れないだろうな
マ同士のコミュが常に上手く行くならマ板のスレは半分以下になるだろうなw
社会不安障害の病人は放っとけよ。それより大した話術も無いのに粋がってる奴はなんなんだよw
*同士のコミュが常に上手く行くなら職業板のスレは半分以下になるだろうなw
いい加減スレチ
うちの会社の先輩(下っ端ってわけじゃないけど役職はなし)の話 すれ汚しだけど いまだに銀縁の四角いめがねで、壁紙がおにゃんこクラブの名前知らないやつで 飲み会で会話に混じらずいつも80年代のアイドルとかゲームの曲を聞いてるwwww ナウシカとか魔女の宅配便の悪口を言うと「あわっ!、わわっ!」って感じで激怒する キーボードはキートップに何も書いていないHHK使っていて ふざけて同僚が「あいうえお」とか「自爆スイッチ」とか「押すと死ぬよ」とか「ウンコでるよスイッチ」とか書いたら 1ヶ月会社来なくなって、上司にえれーおこられた(先輩は同僚の20倍は仕事はできるので) どういう仕組みかよくわからんけど 手首をポンとやるとナイフが飛び出すやつを会社の女の子にみつかってから女子は誰もそいつと口きかなくなった
それがコピペじゃないなら、お前も大概だな
敏腕マと底辺マは、属する文化が違うというお話
ごめん、みんなの話し見ててまるで先輩の事言っているようだなと思ってつい書いちゃった 本当はもっともっとエピソードあるんだけど もちろん彼が極端な例だということも、そもそもスレ違いだということもわかってるよ でもつい
小学生と一緒に仕事してるのか 話したくも無い気持ちはよく分かる
>「ウンコでるよスイッチ」 小学生かよw
>同僚が「あいうえお」とか「自爆スイッチ」とか「押すと死ぬよ」とか「ウンコでるよスイッチ」とか書いたら どこの幼稚園?その会社の商品を使いたくないんだけど 内情を2chにも書き込んじゃうくらいだから情弱集団なんだろう
プログラマ同士なら、ソースを通して理解し合えるはずだ
良いこと言うじゃん
あらら、みんな先輩の側に同情的なんだね 単に笑ってもらえるかと思ったのに >会社の商品を使いたくないんだけど 残念だったね、インフラにかかわる仕事なんで離島で自給自足でもない限り、ほぼ確実に君は使ってるよ >内情を2chにも書き込んじゃうくらいだから情弱集団なんだろう 内情ってほどのことはないだろ、でもいつも明るい笑いが絶えない職場だよ(^^)v >プログラマ同士なら、ソースを通して理解し合えるはず もちろんプログラマとしての彼の技術は尊敬に値する。まったくかなわない
>>918 >同僚が「あいうえお」とか「自爆スイッチ」とか「押すと死ぬよ」とか「ウンコでるよスイッチ」とか書いたら
こんな奴らと気持ち悪く笑いながらやってんだろうな。笑われるのはお前の方だろ
そういうのを笑える奴は嫌いだから
いつも明るい笑いが絶えない職場は人の所有物にウンコでるよスイッチとか書いて喜ぶ人間の溜まり場なんだな勉強になった
お前の会社の商品を使いたくないってレスに対して 2chでは 残念ながらお前は絶対使ってるって返すのがデフォなの?w
一人もつっこみがいない すごい入れ食い
あれ?なんで俺がフルボッコされんの?ちがくね? おれそんな悪い事したかぁ? ここは、「ああ、そういうおかしいやつうちにもいるよ」って流れかと確信してたのに(/o;) ははーん、さてはみんなの心の中にも小さい先輩がいるんだなぁ
逆に、2chでDQNの武勇伝がフルボッコされなかったことがあるのか疑問
>>924 あなたの職場には最低でも二人以上の人もどきがいて
当人は自分のことを大人だと思っていることはよく分かった
質問です putcharって int putchar(int c)ですが引数にchar型変数を入れて char ch = 'a'; putchar(ch); こういうのはダメなんでしょうか。Visal C++ではエラーも何も出ないんですが・・・
>>928 charからintへの型上げ(汎整数拡張)が行われているから
C++だと関数のオーバーロードのためにエラーになるようになっている
ダメじゃない
>>928 あ、ちなみにそれ環境依存動作だから注意な
charがsigned charの環境だと0x80〜0xffはマイナスの値になっちまうので
出力がおかしくなる事がある
0x00〜0x7fのみ保証されている
charは普通signedだろ。
933 :
928 :2010/03/03(水) 19:45:59
>>928 です。
つまり、
char ch = 'a';
printf("%c", ch);
も環境依存ってことになりますか?
c = getchar(stdin) したあと ungetc(c, stdin) で標準入力ストリームに戻す動作は保証されているの? これってstdioがバッファリングされている、という前提だと思うんだけど もしバッファリングされていなければ、標準入力には戻せないよね?
未定義
>>924 先輩に同情がどうとかじゃなくてお前とお前の同僚の頭の悪さに驚いている
うぜーよ、いつまで文句言ってんだろ、もう話し変わってるのに、どんだけ傷ついたんだよww どうせ先輩のエピソードリストのうちのどれか(もしくは複数)がお前に一致したんだろ? はいはい、おまえらの心の柔かい所を私は傷つけてしまいました、ごめんなさい 反省してま〜〜す。
あまりの自己中に唖然としてる俺がいる
ちっうっせーな 反省してまーす
いまさらコケボw どんだけ流行に遅れてんだよw
>>934 'a'は0x80未満だから何の問題も出ない。
まあいずれ符号拡張というのを経験するだろう
943 :
デフォルトの名無しさん :2010/03/04(木) 14:40:17
int配列のバブルソートで 特定の値のみソートの対象にしない (特定値はずっと同じ配列要素数の所に置いておきたい にはどうしたらいいですか?
continue
946 :
938 :2010/03/04(木) 15:09:40
↑ こいつおれじゃねーからな 何が面白くて焚付けてんの?おまえ バカ?
↑ こいつおれじゃねーからな 何が面白くて焚付けてんの?おまえ バカ?
continue
exit
return
abort
>>943 ちょいちょい判定する
か、特定の値の要素番号を別で保持、特定の値を抜いた状態でソートして後から戻す
>>943 #include<stdio.h>
#include<stdlib.h>
#define DATA_NUM_MAX 100
#define SPECIAL_VALUE 99 // 特定の値
#define SWAP(type, a, b) {type c;c=a;a=b;b=c;}
void display(int data[], int data_num){
int i;
for(i=0;i<data_num;i++) printf(" %3d", data[i]);
printf("\n");
}
void sort(int data[], int data_num){
int i, j, k;
for(i=0;i<data_num;i++){
for(j=0;j+1<data_num-i;j++){
if(data[j]==SPECIAL_VALUE) continue;
for(k=j+1;k<data_num-i;k++) if(data[k]!=SPECIAL_VALUE) break;
if(k>=data_num-i) break;
if(data[j]<data[k]) SWAP(int, data[j], data[k]);
}
}
}
int main(void){
int data[DATA_NUM_MAX], data_num=DATA_NUM_MAX, i;
for(i=0;i<data_num;i++) data[i]=rand()%101;
display(data, data_num);
sort(data, data_num);
display(data, data_num);
return 0;
}
954 :
デフォルトの名無しさん :2010/03/05(金) 18:27:24
955 :
デフォルトの名無しさん :2010/03/05(金) 19:03:18
デバッグ中に処理が30fps前後で、リリースしても同じく30前後 にもかかわらず、WindowsMediaPlayerで音楽を再生しながら起動すると60fps これの原因わかる方いらっしゃいますか?(汗 ソース晒そうにもさらす部分もわからないorz
>>955 WMPを起動するとタイマーの分解能が上がる。
キーワードはBeginTimePeriod
958 :
デフォルトの名無しさん :2010/03/05(金) 19:19:01
関数とメソッドの違いってなに?手続き型言語とオブジェクト指向言語での言い方の違い?
959 :
955 :2010/03/05(金) 19:30:12
回答ありがとうございます。・゚・(ノд`)・゚・。 これで先へ進める!
chromeケッとか思てたがMS自体もやってたのか 必然性の度合いは違うけど
>>958 言語によって関数とかメソッドとか手続きとかが何を意味するかは微妙に違ってる
C言語においては関数とメソッドはイコールと思っていいんじゃないかな
C++ではメソッドはクラスのメンバ関数を指してる
パスカルだとちがうんでなかったっけ だからオブジェクト指向言語での言い方の違いではないと思う
963 :
デフォルトの名無しさん :2010/03/05(金) 20:20:21
そういえばC++だとオブジェクト指向でもあるからメソッドも使えるのか、違う用途なんだ。 ありがとう。
言語の話なら、c/c++ではメソッドって言葉は使わない。関数だけ。 COMでメソッドって使うけど、これは言語から離れてる。
C++でメソッド使わないって冗談きついぞ
>>965 メンバ関数っていうんじゃなかった、公式には?
細かいんだよ
968 :
デフォルトの名無しさん :2010/03/05(金) 21:54:16
#include <stdio.h> int main(void) { int i; int* p; p = &i; free(p); return 0; } 用済みになった変数はfreeで返すべき、というのが私の見解です。
>>968 他所様のものを勝手に弄っちゃダメでしょ
まったく躾がなってないね
親の顔が見てみたいもんだ
>>968 malloc() で確保したわけでもないのに free() するのですか?ヒープが壊れやしませんか
>970 free()の定義を見ずにそれを言うのはどうかと >968の言っているfree()は>970の考えているmalloc()と対にして呼ぶような関数では無いのかもしれないよ 僕は>968のようなことを考える人もいるんだなぁ(こいつ分かってないかも)、と思っただけ
972 :
968 :2010/03/05(金) 22:17:39
扱うのはスタック領域だから、ヒープ領域が壊れることはないと思うんだけど #include <stdio.h> int main(void) { {int i; int* p; p = &i; } return 0; } こうすればいいのか
>>971 K&R2 には malloc() の返り値でなければならない、と書いてあります。
malloc() の実装によっては、malloc() の返り値以外を free() に与えると、どうなってもしらないよ状態でしょう。
でっていう 僕が想像したfree() free(void *q) { (void)q; /* something */ return 0; }
>>974 void free(void *p) なんですけどね。返り値はない。
スタック領域をやばいことすると祟られるよ?
free()なんて無数に存在するから別に戻り値の型と仮引数の型の直積はなんでも構わないんだけどね >974は>968に合うように作ったfree()の一例ね なぜ、>974が>968のfree()の一例になるのかは>971を読んでね
前にも自動変数を自分で解放したがるアホが湧いたことあったなあ。
>>978 だから、malloc() / free() はついになっていなければならないし、free() は返り値を持たないと、K&R2 に書いてあるのですが。
K&R2 をご存知ないのですか?
981 :
デフォルトの名無しさん :2010/03/05(金) 23:04:59
return a; return (a); 関数の返り値でこの二種類の違いについて教えてください お願いします
()があるかないかだよ
>>979 そして
>>975 のいうとおり、自動変数をfree() するならするで徹底してfree() できていないという矛盾。
関数を呼び出すと、スタックフレームがpushされますが、自動変数の領域の大きさはどこから得ているのですか。 実行時にわかるのでしょうか。autoだけに。
コンパイルしやすいと言ったら、PASCALやC、昔のBASICあたり?
>>985 実行時にわかるよ。てかコードに書いてある筈
君もやってみれば?
>>985 関数の呼び出し時では引数の個数だけ push すればいいし、関数内の自動変数の種類と個数はコンパイル時に数えることができるでしょう。
>>988 コードに書いてあるというのは、テキスト領域に書いてあるということですか。
>980 K&Rが全てだと思っている痛い子とはもう話したくない free()がvoid free(void *)だと思っているし、もう笑うしかないわ
>>991 すみませんが典拠をお願いいたします。free() は void free(void *) しかないと思うのですが?
>>990 そのあたりはコンパイラに依存。
コードに即値として埋め込まれてる場合もあるし
初期データ領域から引っ張ってきて更にちょこちょこ
計算して出せやという命令に
なってる場合もあるし...
free()はvoid free(void *)だよ
コンピュータが人間に復讐する日
999 :
981 :2010/03/05(金) 23:24:56
ありがとうございます
>968
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。