1 :
デフォルトの名無しさん :
2009/02/19(木) 20:47:45 BE:302948148-PLT(56870)
char *color_name[] = { "red", "green", "blue" }; printf("testcolorchar=%s\n", color_name[1]); これで"green"が取得できるけど、 "green"の"n"を取得するには何て書けばいいんですかの。
・printf("%c\n", color_name[1][4]); ・printf("%c\n", strchr(color_name[1], 'n')); ・printf("%c\n", 1[color_name][4]);
いけね、2番目訂正。 printf("%c\n", * strchr(color_name[1], 'n'));
ノ printf("testcolorchar=%s\n", color_name[2]-2 );
>>3 printf("%c\n", color_name[1][4]);
エラーになって2時間悩んだけど%sにしてたからだったのか。
8 :
476 :2009/02/20(金) 00:07:55
ポインタ演算子って多くないですか? 覚えるのややこしいし int u[10][5];でu[1][2];の値を出すにはどうしますか? 私はu[1][2]とやります わざわざ*(u[1]+2)とかやるのでめんどくさいので 統一とかあるんですか?
うぜえ
ポインタ操作ほど操作が統一されている物もないだろう…
かけ算と紛らわしいくらいでややこしいってほどのもんじゃなかったような
まだいたのか
まだ釣られてるのか
14 :
5 :2009/02/20(金) 01:05:48
>>6 実行環境言ってみ
>>2 は"n"の取得を聞いてる。
*color_name[] = { "red", "green", "blue" };
文字リテラルの初期化だから、目盛り構造は、
[r] [e] [d] [\0] [g] [r] [e] [e] [n] [\0] [b] [l] [u] [e] [\0]
printf("%s",p);の時か
p=color_name[1]+4; p =color_name[2]-2;
でpは、"n"へのポインタとなる。これが、"n"の取得と解釈した。
char*配列のデータが連続して配置される保障ってあるの? 別場所に同じ文字列があったりしたらコンパイラが配置の最適化できると思ったんだけど
>>14 配列の配列と勘違いしてるし
仮に配列の配列だとしても要素配列の間にパディングが入らない保障はない(滅多にないだろうけど)
>>14 パディングとか関係なく、連続で取られる保証はないし、
順番がソースコードの出現順である保証も全然ないし、
ありえないにも程がある
なんで必要性もなく、効率が良いわけでもないメモリ配置に依存しているコードを書くのよ…
>>14 実際にやってみなよ。"red,", "red", "blue", "green", "blue"みたいに重複が発生するように。
それでもあんたが主張するようにしか配置されていないのだとしたら、あんたの使っているコンパイラが蛸だ。
>>18 >14のことなら、今背伸びしたいお年頃なんでしょ。
>char *color_name[] = { "red", "green", "blue" }; >printf("testcolorchar=%s\n", color_name[1]); >これで"green"が取得できるけど、 ここまでは分かる。しかし… >"green"の"n"を取得するには何て書けばいいんですかの。 これが分からんのだよ。つまり最後の一文字を取得したいという事? そうであれば以下のようにすればよいかと。 char *color_name[] = { "red", "green", "blue" }; char *element = color_name[1]; int len = strlen(element); char c = element[len-1]; これで
…途中で送信してしまったorz char *color_name[] = { "red", "green", "blue" }; char *element = color_name[1]; int len = strlen(element); char c = element[len-1]; これで配列color_nameの第一要素"green" の最後の一文字がcに入るよ。 文字列や文字のsignedとunsignedの違いに気を付けてね。
ふつうに char* pc; pc = color_name[1]; for(i = 0; *(pc + 1) != '\0'; pc++); では駄目なん?
ふつうとは?
// / / パカッ //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ まピョーん☆ / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
iいらないじゃん… 寝ぼけているな俺
叩けるコードが出てきた時のこのスレの賑わいは異常
レベルが初歩的だとなおのこと盛況
叩けないコードを勘違いして叩いたあげくに逆ギレするよりよっぽどマシw
ここも2ちゃんだから、勘違い上級者なら叩かれても仕方ない。 しかしそのままずっと勘違いするよりはマシかもな
31 :
℃素人 :2009/02/20(金) 09:02:10
/* プログラム@ */ #include <stdio.h> int main( void ) { int *x,*y; printf("%d\n",(&y-&x)); /* ここでの表示結果は"1" */ return 0; } //------------------------------------------------------ /* プログラムA */ #include <stdio.h> int main( void ) { int *x,*y; printf("%d\n",sizeof(&y-&x)); /* ここでの表示結果は"4" */ return 0; } //------------------------------------------------------- プログラムAではsizeof演算子を付けて 望んでいた結果の"4"が出力されます。 何故、プログラム@では"1"が出力されるのでしょうか? コンパイラは「Microsoft(R)32-bit C/C++ Standard Compiler」です。
1はアドレス同士の計算結果を表示してるのに対して、 2はアドレス同士の計算で返った結果のサイズ(アドレスのサイズ)を表示してるから。
33 :
℃素人 :2009/02/20(金) 09:29:37
早速のレスありがとうございます。 しかし、@のプログラムでも"ポインタ"のアドレスの計算を しているワケですので、私の32bit環境ではポインタとして 4byteをメモリに占めているので"4"が返ってきても良いとは 思うのですが・・・すみません。
>>31 その結果が正しいとして...
MSC++では、アドレスは4バイト単位みたいな感じ
ポインタは32ビットで表記するのにね。
>>33 ポインタ同士の引き算は、実際のアドレス値ではなくポイント対象の距離になる。
例えばこれらはどれも1。
int foo[2]; printf("%d\n", & foo[1] - & foo[0]);
char foo[2]; printf("%d\n", & foo[1] - & foo[0]);
double foo[2]; printf("%d\n", & foo[1] - & foo[0]);
しかし、配列やヒープのように連続していることが保証されている場合以外に
ポインタ同士の引き算を行なっても結果は保証されない。
つまり、>32の(1)は何が起きても不思議ではない危険なコードと言うことになる。
しかし、>32の(2)は演算結果の型のサイズを取得しているだけなので話は別。
>32の2行目の表現は、「アドレスのサイズ」ではなく「ポインタのサイズ」とするべき。
36 :
℃素人 :2009/02/20(金) 09:50:00
>>35 さん
ありがとうございます。
ちょっとこれから出かけてきますので、
また後ほど。
((char*)&foo[1]-(char *)&foo[0])/sizeof(type) といつでも解釈して貰えると思ったらそれは違うだろ
>>37 & foo[1] - & foo[0]
を等価の式に変換してごらん。
pointer[integer]は*(pointer + integer)と相互に置き換えが可能だから、
& pointer[integer]は&*(pointer + integer)になる。後は判るだろ。
久しぶりにプログラムを書いてみようとしたら、構造体やらポインタでつまずいた。 typedef struct Tag{ int member; char text[1024]; }KOUZOUTAI; メンバ変数のサイズの取得の仕方がわからん。 KOUZOUTAI Obj,*pObj; pObj = &Obj int size = sizeof(pObj->text); でいいの? (size == 1024 になって欲しい) あと、メンバ変数のアドレスを調べたい memberのアドレスを調べるには、多分、&(pObj->member)でいいと思うけど、textの方は? &(pObj->text[0])とかでいいの? それとも、pObj->text のようにするの? 普段、クラスはおろか構造体すら使わないので忘れてしまった。 どうでもいいけど、構造体ってコンストラクタを持てるんだね。初めて知った。
>普段、クラスはおろか構造体すら使わないので忘れてしまった。 >どうでもいいけど、構造体ってコンストラクタを持てるんだね。初めて知った。 そりゃあんた、言語が違いまんがな。
41 :
476 :2009/02/20(金) 11:44:39
ポインタの説明が回りくどいんですが int 型の変数へのポインタ値をしまうことのできるポインタ型変数 p が宣言される これはつまり、int ball;があったとしたら int型の変数(ball)のメモリアドレスの値(aのアドレス)をしまうことができる ポインタ*pってことでいいんですか? 日本語力とか言いますが一般人にはわかりずらいと思います int a; a は intである では無く a は int型である のほうがわかりやすいと思いますし int *a[10]; a は、intへのポインタの配列(要素数10)である。 これだと aはint型の配列を代入できるポインタとかでいいんですか? ごっちゃになってるので誰か詳しくまとめてくれるとありがたいです。
試せばすぐ判るようなこと聞くなよ。
しかし仕事で構造体を使わないCプログラムを書いたこと無いんだが、
>>39 はどういう分野の人なのかな。
あと476はもう結構
>日本語力とか言いますが一般人にはわかりずらいと思います 対象は一般人じゃなくてプログラマだからそれで良いんだよ。 >これだと aはint型の配列を代入できるポインタとかでいいんですか? よくない
44 :
デフォルトの名無しさん :2009/02/20(金) 11:55:43
char score2grade(int s) { if(s >= 80){ return 'A'; }else if(s >= 65){ return 'B'; }else if(s >= 50){ return 'C'; }else if(s >= 35){ return 'D'; }else{ return 'F'; } } 最後の行がparse error at end of inputらしいんですが どう直せばいいのでしょうか?
45 :
476 :2009/02/20(金) 11:58:46
44さん 私の環境ではコンパイラできました たぶん他のコードでエラーがおこってるのかもしれません
46 :
44 :2009/02/20(金) 12:01:21
自己解決できました
parse error at end of input ホンニャクすると こんだけのソースで仕事できっかよ!ゴラ
>>41 まともな日本語力のある人間は
「ポインタ値」を勝手に「メモリアドレスの値」に変更したり
「変数(ball)」を「a」に変更したりしない
あとここはお前の読んでいる本の訂正をしてくれる場所じゃない
476は中学生か? いい加減に自立しろよ 親にでも聞け
int main(void){ char select[2]; int a,b; printf("1文字分\n"); /* 1回目 */ fgets(select, 2, stdin); sscanf(select, "%d", &a); printf("1文字分\n"); /* 2回目 */ fgets(select, 2, stdin); sscanf(select, "%d", &b); /* aとbを後の処理で数値として利用 */ return 0; } この場合、2回目が実行されません。 select[]を空にしなくてはいけないのだとと思い、1回目の処理の後、 [0]と[1]に\0を入れてみましたが、問題が解決されることはありませんでした。 配列を2つ用意すれば解決はしますが、できることなら配列を1つのみで すべての処理を行いたいと考えております。どうしたらよろしいのでしょうか?
>>50 配列の中身は関係ない。問題は配列の大きさと読み込む文字数にある。
fgets(select, 2, stdin);
この命令は、stdinから1バイトしか読み込まない。
つまり、Enterキーを叩いたときの\nはストリームに残ったままとなる。
次のfgetsではその\nだけが読み込まれる。
配列のサイズと読み込み文字数を増やすこと。
52 :
476 :2009/02/20(金) 14:59:35
int u[10]; int (*p)[2]; p=u; u[10]を2次元配列として扱いたいんですが p=u;とやっても u[5][2]みたいな感じになりません どうすればよろしいのでしょうか?
>>52 論理的な思考のできない人間がプログラミングやるのはあきらめてください
54 :
50 :2009/02/20(金) 15:02:40
>>51 なるほど、理解できました。
素早い回答、ありがとうございます!
>>53 君にそれはそのまま当てはまるかもしれんぞ
>>476 typedef int (*array_5_2)[5][2]
array_5_2 p;
p=(array_5_2) &u[0];
でコンパイラが解ってくれたら儲け物ぐらいに思っておこう。
実際に動かして問題が無いかチェックする作業は絶対に
避けられない。(出来れば出力アセンブルコードを見て
検証したいもの)
コンパイル出来ても期待した通り動いてくれる保証は無いから。
こういう場合は、自分で二重添字を一次元化する処理をして
配列を扱うのがキホン
#define U(i,j) u[ 5*((j)-1)+(i) ]
てな感じで、マクロにしてしまおう。
型変換に関してはCは実は余り得意ではなく、すんなり通すがやること
滅茶苦茶なケースが多い。
typedef やマクロに進むまで配列やポインタはひとまずフリーズ
したらどーだ?
いや確実に大丈夫だろ
58 :
デフォルトの名無しさん :2009/02/20(金) 15:26:08
55さん ポインタ苦手あんですが ポインタってそこまで重要しなくていいんですか? やっぱポインタがわからないとダメですか? プロの方とかはポインタとか沢山使ってるのでしょうか? 仕組みとかわからないとむかつきます。丸暗記みたいにつめこむのがやなので
仕組みがわからないとむかつくって… 君はprintfがどのような事をやっているかわかっているの? int a = 1;がどのような処理を行っているかわかってるの?
>>58 仕組みがわからない段階で
それを使って人に使わせるのが嫌という心は健全だと思うね。
最低でもそのコンパイラが病気かどうかぐらいは診断できる
位のスキルが無ければ(つまり出力コードを見てその善し悪しを
判断できる)本来、コンパイラを使ってプログラムを製造し
人に販売するような行為を行うのは安全じゃない。
(それ言い出せば、今度はプロセッサが正常か、メモリが正常か
テスト出来なければNGとかになってお話にならないが)
ただ仕組みはわかったとしても一通りじゃないから、趣味や自己啓発
でやる限り、仕組みというよりか基本感覚みたいなものを感じ取れ
ればいいんじゃないのかな?
int u[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int (*p)[2] = (int (*)[2])u; int i,j; for( i = 0; i < 5; i++ ){ for( j = 0; j < 2; j++ ){ printf( "%d\n", p[i][j] ); } }
「実体」を指さないポインタの使用の可否は強く処理系に依存
991 名前:デフォルトの名無しさん[sage] 投稿日:2009/02/19(木) 22:35:34
問題です
1.int a; &aは、ポインタでしょうか?
>>476 がんばってくれ。
↓参考
#include<stdio.h>
int main(){
printf( "476を応援 %d \(^O^)/%sTEL\n"+0XA,0x1dc,'-'/'-'+"POW\bWAT\b");
return 0;
}
>>52 int u[10];
uの意味してるものは最初の要素であるu[0]の場所。
つまり、&a[0]であり、この型は int *型。
pは、int (*p)[2]; と宣言しているようにこれは int (*)[2]型。
このままだとp = u;は型が違うから代入できない。
でも[10]の並びを[5][2]という並びにしたい。
そこでキャストが必要になる。これを具体的に
>>61 がレスしてくれてる。
前スレでやってたのはこれと逆のbalance[2][5]をbalance[10]としたいキャスト。
とりあえず3日前よりはポインタ周辺の理解が進んでるんだから
>>56 の言ってる通り、先に進むのがいいんじゃない?
前スレをきちんと保存しておいて、後で読み返せるようにしとくのがいいと思うよ
JavaとC/C++で迷っています。 プログラミングは未経験です。 どっちがわかりやすいですか?
とりあえずC++が一番わかりにくいのは確かだ
C言語を軽く一通りやって、C++の新しい文法とかをちょっとやったら 本気で、Javaの基礎から勉強する、とか。もちろん、CだけとかC→C++で全部やっててもいいんだけど、 最初やるべきは、Cの概論じゃない?
C言語だけでも携帯ゲームって作れるんですか?
>>68 PSPの開発言語は基本はC言語って聞いたことがある
DSはわからない
携帯ならCかC++だろう
71 :
デフォルトの名無しさん :2009/02/20(金) 19:02:07
質問です。 オープンソースのプロジェクトでソース解析してると、以下のような、 関数内部でメモリ領域を動的に確保して、それを戻り値として返す関数をよくみかけます。 直接malloc使ったほうがスタックの領域が無駄に蓄積しないと思うんですが、意図があって 作ってるんでしょうか。 #include <stdlib.h> void *alloc(size_t n) { void *p; p = (char*)malloc(n); if(!p){ return NULL; } return p; }
72 :
デフォルトの名無しさん :2009/02/20(金) 19:04:49
ある構造体 MATRIX を以下の様に作っています。 typedef struct MATRIX_STRUCT { long row; long col; float **data; } *MATRIX; その上で、下の様に matA を宣言しています。 この matA を引数にして関数を実行し、その関数の中で matA->data のサイズやデータを決めているのですが、 もとの関数に戻ってきたときに、matAがNULLのままになってしまいます。 詳しくは以下のように書いています。 void hoge(MATRIX matA); int main(){ MATRIX matA = NULL; hoge(matA); // matA が NULL のままです。 return(0); } void hoge(MATRIX matA){ matA = matalloc(3, 4); // 3*4の行列を作る関数です matA->data[0][0] = 1.0; matA->data[0][1] = 1.5; ・・・ //この時点では、ちゃんと matA 内にデータが入っています。 return; } どのように記述すれば良いのでしょうか?よろしくお願いします。
MATRIX hoge(MATRIX matA){ matA = matalloc(3, 4); // 3*4の行列を作る関数です matA->data[0][0] = 1.0; matA->data[0][1] = 1.5; ・・・ //この時点では、ちゃんと matA 内にデータが入っています。 return matA; } 引数書き換えても反映されるわけねーだろ
void hoge(MATRIX *matA){ (*matA) = matalloc(3, 4); // 3*4の行列を作る関数です (*matA)->data[0][0] = 1.0; (*matA)->data[0][1] = 1.5; ・・・ //この時点では、ちゃんと matA 内にデータが入っています。 return; } 呼び出し方法変わるけどこれでも
>>71 大昔はmallocの返り値が(char*)だったらしいからその対策と思われる
>>71 if(p==NULL)○
if(!p) 邪悪
なんの為に(char*)してるのか?
そのallocならばmallocをラップしてるだけで意味は薄い。
別のmalloc関数を使いたくてALTERの意味でラップしているの
かも知れないが.
malloc系のメモリを内部で確保して加工したものを返す関数
は個人的開発の場合多用すると何かと便利だが、集団開発を
前提とした開発の場合は多分タブー。
それ以前にmallocを多用するプログラムはCよりかC++
Javaのほうが向いている。(new/delete)
>>72 MATRIXじゃなくてpMATRIXという名前にすれば
*もしかしたら*間違えなかったかも
77 :
デフォルトの名無しさん :2009/02/20(金) 19:18:33
>>71 マクロでデバッグのときだけ別の関数を呼ぶようにしてるとか、
コンパイル時に別のソースファイルに切り替えるとか。
多分将来の機能追加かデバッグ目的とか。
あと、malloc()の戻り値もpと同じ型だから、malloc()のキャストは削除した方がいい。
しかも、CではC++と違ってvoid *とその他の記憶領域へのポインタはキャストせずに相互代入可能だし。
作った人が変なだけかもしれない。
78 :
デフォルトの名無しさん :2009/02/20(金) 19:21:52
>>75 ,76,77
なるほど。参考になりました。
>>75 それって、void*型が無かったころの話じゃないの?
void* 型が導入されたけど、mallocの返り値はchar*のままっていう時代があったの?
>>76 >if(p==NULL)○
>if(!p) 邪悪
君の好みなんか誰も聞いてません
元ソースはバカだけど
81 :
デフォルトの名無しさん :2009/02/20(金) 19:38:58
>>71 以下はfreeを用いた加工関数だが、freeした後にNULL代入しておくと
二重freeの防止に役立つ。
void nfree(void *p)
{
free(p);
p = NULL;
}
85 :
デフォルトの名無しさん :2009/02/20(金) 19:44:06
>>81 void nfree(void *p)
{
free(p);
p = NULL;
}
int main(void)
{
char *p=NULL;
printf("p=%p\n", p);
p=malloc(7743);
printf("p=%p\n", p);
nfree(p);
printf("p=%p\n", p);
return 0;
}
ポインタが絡むと参照渡しがわからなくなる人は以外に多い。
>>72 です。
みなさん、ありがとうございました。
希望通りの動作をしました。
まだポインタについて理解が足りないようです。
>>81 #define nfree(p) do { free(p); p = NULL; } while (0)
92 :
デフォルトの名無しさん :2009/02/20(金) 19:57:14
>>81 です。すみません、なんかポインタに対する誤認識があったようです。
出直してきます
ポインタ関係なくない? ただのスコープの話じゃん
94 :
デフォルトの名無しさん :2009/02/20(金) 20:00:34
板杉
ね−よ
'ね' - 'よ' = -27
>>92 (C言語では)引数は常に変数のコピーが渡される。
だからポインタ(型変数)のアドレスを貰わないと、書き換えできない。
風呂で携帯レスはダリア
ところでK&Rの初版だと二次元配列を引数にするときは、
列を省略するな、みたいな事が書いてあったけど、
ANSIってどうなってるの?msc3以降コンパイルしたこと無いからわかるん
>>97 C99には int x[][*]
見たいなのがあるよ
100 :
℃素人 :2009/02/20(金) 23:12:59
>>35 さん
遅くなりましたが、ありがとうございました。m(_ _)m
あれから、色々と試してみて理解できました。
それにしても、Cのコンパイラの解釈って・・・orz
>>100 何を思ったか知らんけどたぶんその感想は的外れだ
102 :
476 :2009/02/21(土) 00:05:16
最後のラスボスはポインタです ラスボスを無視して進でこうかと思います 次へ進んでいくと 再帰とか構造体とか中ボスがでてきそうでやです
103 :
℃素人 :2009/02/21(土) 00:13:20
>>101 さん
何が的外れなのでしょうか?
アドレス減算の件でしょうか?
sizeof演算子によって得られるポインタ型のサイズの件でしょうか?
ご指摘お願いします。
>>80 Cは型にうるさく無いから、何でも適当に融通を効かせて許容してく
れるという誤解が通用しているがこれは絶対に忘れたほうがいい。
C位型にうるさい言語は無い。
型が間違っている場合は処理系に強く依存した
*勝手な解釈で*キャストして稀に致命的な結果をもたらすコードを
平然と吐く。それがたまたま幸運な方向にいくことが多いから
上記のような誤解が発生する。
残念ながら処理系によっては
#define NULL 0
としているものがあるが
#define NULL ((void*)0)
が正しい。
if( p==((void*)0))は期待した通り動作するだろう。
しかし
if( !p)は
if( !((int)p) )という意味になるが、NULLのint変換値が0でない処理系では
全く期待した動作にはならない。
NULLのint変換値が0でない処理系ってどんなのがあるの?
裏ボスは関数ポインタ
NULLはANSIで0に決められていたような
>>104 それはおかしい。
!pとp==((void*)0)は同じ結果になる。さらに、p==0でも同じだ。もちろんNULLの表現が0でなかったとしても。
(void*)0でもただの0でも、この場合、pと同じポインタ型に変換される決まりで、
整数定数の0をポインタに変換すれば、ヌルポインタになる。
だから#define NULL 0も問題ない。
((void*)0)にする理由としては、ポインタでないintやcharに対して使おうとするアホを吊るしあげるためのほうが大きい。
>>104 5.3:
ポインターがヌルポインターでないかどうかのテストの省略形「if(p)」は有効なのか?
ヌルポインターの内部表現が0でない場合はどうなるのか。
A:
C言語が式のブール値を必要とする場合(if、while、forやdo文において、
また&&、||、!、?:演算子と共に使う場合)、0と比較して等しい場合は偽の値が産み出され、
その他の場合は真が産み出される。すなわち
if(expr)
と書いたらいつも、「expr」がどんな式かにかかわらずコンパイラは必ず
if((expr) != 0)
と書かれたように基本的には動作する。ポインター式「expr」をpに置き換えると、
if(p) は if(p != 0)と同じ
ということになる。比較をするので、コンパイラは(式では現れれないが)0がヌルポインターを表していると判断して
正しいヌルポインターの値を使う。インチキはない。コンパイラはこのように動き、どちらの式についても同じコードを産み出す。
ポインターの内部表現は関係「ない」。
論理否定演算子!は以下のように記述することができる。
!expr は基本的に (expr)?0:1 と同じ あるいは、((expr) == 0) と同じ
これから以下の結論が得られる。
if(!p) は if(p == 0) とおなじ。
if(p)のような"省略形"は、文法的には正しいけれど、よくない書き方であると考える人もいる
(よい書き方であると考える人もいる。質 問17.10を参照)。
http://www.kouno.jp/home/c_faq/c5.html
int==ptr も ptr==int もptrに換算して比較される? 逆だろ?
>>110 Cではポインタが来ると考えられる場所に整数定数0を書いたら必ずヌルポインタに置き換わる。
換算される=内部表現が0のポインタがヌルポインタなのではない。
皆Cにはいろんなバリエーションがあるようですなw
基本的に変なのは104だけじゃね?
マイナー環境ならコンパイラを信じないほうがいいかもしれないけどな
>>104 NULLは整数の0と等しい。たとえNULLのビット表現がALL0でなくても、だ。
#define NULL ((void*)(-1)) って処理系みたことあるぞ
>>117 そりゃそいつがANSI準拠でないというだけの話。
ちなみに、規格合致したければ、Cのソースコード上は0にしておいて、
コンパイラの中でよろしくやってくれるようにしないといけない。
>117 NULLの定義は処理系独自の実装でもよいことになっているので、そういうこともありえる しかしそのような処理系であっても、NULL==0は真にならなければ規格違反になる。
C99/C++ では NULL は処理系定義だからな
(int)(void*)(-1)==0となる処理系だったという話ね
>>121 間違っている。ヌルポインタをintにキャストしたらその式が真になる保障はない。
もう一度説明しよう。比較や代入でポインタ式が必要とされる場所に整数定数0を書いたら、
コンパイラはそれをヌルポインタ値に置き換える。
だからもし(void*)(-1)がヌルポインタとなる処理系があったとしたら、
(void*)(-1)==0 は真になる。しかしその前にヌルポインタをintにキャストしてしまったら、
このコンパイラによる置き換えは発生しない。恐らく結果は真にならないだろう。
ヌルポインタってなぁに?
>>123 絶対に、どんなオブジェクトも関数も指し示していないことが保障されている特別なポインタの値
って1つかな?
値が1つかな、という意味で質問しているならそうじゃない Windowsだと0x00000000から0x0000FFFFまでがNULL
>>125 ある型についてのヌルポインタ値はひとつしかない(でないと比較ができない)
型ごとにヌルポインタ値があるかどうかは未規定
コンパイラが保証するのか、ライブラリ作成者たちが厳守する という意味での保証なのかってことだろな
129 :
デフォルトの名無しさん :2009/02/21(土) 01:10:19
>>126 何でそんなにあるんだろう。
それなら0xFFFFFFFFから0xFFFF0000もNULLにすればいいのにね。
どうせこんなとこで議論したところで信頼性0なんだからやめちゃえばいいのに
>>126 ヌルポインタとはまた別なものでは、それ
>130 >109にソースまで出ているのに何を言っているんだ
お前らほんとNULLの話好きだなwww
135 :
デフォルトの名無しさん :2009/02/21(土) 01:18:58
C FAQを知らん奴はいないだろ
ぬるぽ
ッガ
>>129 int *p = NULL;なのにp[1]のようなことをやるおっちょこちょいなプログラムのためということが、
確かAdvanced Windowsに書いてあった。
だけどこれまで全部NULLというのは無理があると思う。
139 :
デフォルトの名無しさん :2009/02/21(土) 01:50:06
>>138 いや、だから、p[-1]とかやるおっちょこちょいのために
0xFFFFFFFFから0xFFFF0000もNULLにした方がいいだろ?
さすがにそれはお茶目過ぎじゃないのか NULLポインタに代入するだけじゃなくindexまで…
ヌルぽが1つも無い処理系もあり得る。 それでもNULLは定義されている。
struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000 + (double)tv.tv_usec * 1e-3; このときreturnで返ってくる値の単位がよくわかりません
ぼくにもよくわかりません
常識的に考えてミリ秒だろ。
僕に分からないコード書いて?
146 :
デフォルトの名無しさん :2009/02/21(土) 03:12:32
「関数ポインタを、シグネチャの違う関数ポインタへキャストして実行」ということをやってしまってもいいのかな 以下のようなコードで実験してみたところ、エラーとかにはならないみたいですが。危険なのかな。 void sub(int i, int i2) { printf("%d\n", i); printf("%d\n", i2); return; } int main(int argc, char *argv[]) { int (*sub2)(int) = (int (*)(int)) sub; printf("%d\n", sub2(8)); return 0; } //// 出力結果 8 (←正常な値が取れてる) 29987717 9
さすがに引数の数(とそれぞれのサイズ)が違うのを呼ぶのはまずいだろ。 引数がレジスタ渡しだったり、逆順に評価していたり、引数のポップを呼ばれた側でやるような実装だったら、動かない可能性大。 引数の数(とそれぞれのサイズ)が同じか、ないやつなら、問題少なそうだが、それとて処理系依存だったような気がする。
typedef struct { // 略 } S1; typedef struct { // 略 } S2; S1 *sub(S1 *arg1, S1 *arg2); だとして、こいつを S2 (*sub2)(S2 *, S2 *) = (S2 (*)(S2 *, S2 *))sub; ならありですかね?。
>>148 関数ポインタのキャストは禁止
てゆーかそんな変換になにを望んでるんだ?
150 :
デフォルトの名無しさん :2009/02/21(土) 04:31:23
あるソフトをLinuxに移植してて必要になった
151 :
147 :2009/02/21(土) 04:43:00
いやwindowsっす。 関数ポインタのキャストが許されるなら、関数を他のモジュールにエクスポートする際にちと便利になる(引数をいちいちキャストせずに関数ポインタだけキャストすればすむ)状況があったのですが、禁止がならしかたないですね。 ありがとうございました。
C言語初心者です。 超初心者向けの参考書を読んだことがある程度です。 仕事で組み込みマイコン向けのC言語のプログラムを書かないといけなくなりました。 先輩の元ソースを修正するだけなのですが、その元ソースの動作が理解できません。 C言語の逆引き辞典のようなもので、お勧めの書籍はないでしょうか? 元ソースを解析できれば何とかなりそうなのですが。
処理系によっては適当に引数を補って正しく呼んでくれるだろ >>関数ポインタ
154 :
デフォルトの名無しさん :2009/02/21(土) 09:09:50
getchar() 一文字読み込む putchar(c) 一文字出力する gets,getc,putcとの違いをおしえてください。 混乱してきました。
処理系依存 以上
158 :
デフォルトの名無しさん :2009/02/21(土) 09:32:56
>>153 「処理系」とかいう便利な小人さんでも存在するのか?
一杯あるじゃん
いっぱいあると言いながら一例も例示できない奴ってたまにいるよな。
存在するか? -> 一杯ある 態々例を挙げる必要は無い
いっぱいあると言いながら一例も例示できない奴ってたまにいるよな。
Cの規格は最大公約数的平均とまではいかないが、重心といった ところだろ。
グローバル変数について質問です。 関数の外でint test=50;と定義したら、testは静的領域に確保されて、 そのときstatic宣言するとファイル内にスコープが限定されて、 他のファイルでextern宣言するとそのファイル内で使える、 であってますか?
数学風の用語使うなら数式で書いてよ。言葉だけだと意味分からんから。
>>164 static付けたら外部参照できないよ。
過去と未来ではあってないだろうな
>>153 基本的にそりゃコンパイラのソース読まないと判断出来ないな。
少なくとも俺はマニュアルにそんな記述があるコンパイラは見たことがない。
そういう君はやがてそういうコンパイラを書くだろう
関数ポインタの配列を使って関数呼び出しすると実際に呼び出している関数名がすぐには分からなくてデバッグする際に余計に時間がかかるので、 関数ポインタの配列を使った関数呼び出しをするよりもswitch文で呼び出す関数を分岐した方が保守性がよいので関数ポインタの配列を使った関数呼び出しは するべきではないと思うの
グローバル変数を使うのと、あるファイルに実態が書かれたstatic変数をポインタを介してプログラム全体から利用できるようにするのとでは 前者の方がマシだと思うの。前者だとグローバル変数を読み書きする変数名は実態そのものだからすぐ発見できるが後者だと実態に読み書きしている 変数名がばらばらになりがちでどこで読み書きしているかわけわかめになりがち。
switch文だと、似たようなコードが延々と並ぶわけだろ ろくなことにならない 関数ポインタ使って1行で済むなら、そっちの方がはるかにいい
プログラミングってデバッガやエディタの習熟度によって記述能力が変わるものなんだな
つーか
>>172 はグローバル変数がなんでだめなのかわかってないんじゃねーの?
後者もグローバル変数の使用で生じる害と同じことが起こるだろ
関数ポインタはコールバックに使うことが多いだろ。
グローバル変数は使い方次第なので好きに使えばいいんだけど、
>>172 の問題は、extern で受ける変数名がばらばらってとこだろう
そんなことするからおかしなことに
>>170 >>172 そういったのはすべて対症療法よ。
根本療法じゃないんで。念のため。
患者さんによって違うわ
>>178 いや、素直に読むと モジュール内から static変数のアドレスを渡す関数化なんか用意して
外部モジュールでハンドリングする事を想定した文書だ
困った用法を最悪の形で実装した例だな。
Setペケペケ/Getペケペケ なんてのもダメなわけね
setter/getterはダメなオブジェクト指向の見本でしょ
>>182 オブジェクト指向にはついていけなかったのか・・・
グローバル変数がめちゃくちゃに数が増えました。名前が付いたもの だけで10000個以上あります。 整理しろと言われました。(ただし数は減らせません) どのようにすればいいでしょうか?
構造体に全部つっこめ
・諦める ・泣きつく ・せめて構造体に放り込む
>>184 複数プロセスに分割する、
structをネストして階層化する等いろいろあるだろ
べったり千個の変数を管理できる能力を生かす仕事は他にいくらでもあると思う。
>>184 とりあえず static にしてみろ。
>>188 あんたは先ず、眼科に行く必要がありそうだな。
「整理しろ」って文言で何を要求しているかも分からねーよ
gval[10000]
10000個をまともに整理するのは無茶だ。 とりあえずstaticにして関数を通じて操作させるようにして モジュール性を持たせるのがせいぜいだろう。
なるほど
いやいや・・・
そのグローバル変数を全て新規に作ったソースファイルの中にstaticをつけてぶちこんでそれぞれにゲッターセッターを用意して、 操作してる部分を全てゲッター、セッターに変更することにどれほどの意味があるのだろう。 グローバル変数がグローバル関数もしくはグローバルオブジェクトになるだけじゃね
少なくともブレークポイントは置けるようになる
ゲッタセッタにブレークポイントを置けるようになるということだが
それは変数の監視と変わらなくね?
「触わんなボケ」や「無茶言うなボケ」機構が有ると無いとじゃ大違いって事が判らんのだろうな
なるほど
入門書一冊終わったばっかりのカスですが ビット演算子(&、|、^、<<)について処理自体はシンプルなので理解できたと思うのですけど 実際どんな場面で使用されるのかピンと来なくて消化できた気がしません・・・ どんな場面で使用するとその有用性が理解できるかどなたかご教授願います
フラグ
IPアドレスとか、0x000F&を取れば最後の255の部分がわかったり true colorの番号を赤緑青に分解したり ^を使えば黒<->白になるので背景と必ず逆の色が指定できて便利だったり
ビットフラグって便利なの? ただのメモリ節約とかそういう感じ?
208 :
476 :2009/02/21(土) 18:39:25
テトリス作りたいんですが。 再帰使うと聞いた事あるんですが、画面をクリアするってききましたが。 やっぱりポインタができてないとテトリスはつくれないんですか? あと構造体
>>206 遅レスすみません
特殊な状況(あくまで自分の視点)で使うことが有るんですね
ありがとうございました
作るだけならポインタできなくても大丈夫 それよりもアルゴリズム考えるの頑張れ
211 :
476 :2009/02/21(土) 18:48:26
210さん アルゴリズムの本もってます アルゴリズム事典 数学的で難しい事ばっかりかかれてます なんか頑張れっていわれるとうれしいですありがとうございます。 CUI RPGでマップ表示までできます 後主人公うごかせました ですが壁とか通り抜けたりしました。RPGとかの壁にぶつかったとき壁をすりぬけないとか そういう判定とかのってるページありますか?
そういう事はテトリス作ってから言え
CUI RPG よりパックマンの方が妥当な気がする
足踏みループアクションから攻撃アクションみたいな切り替え方のうまい方法がわからん
215 :
476 :2009/02/21(土) 19:42:31
CUI RPGのほうが簡単そうなんですが パックマンはレベル高そうです もし私が一通りファイルの扱いや構造体を覚えたらどんなゲームを作るのがおすすめですか? 簡単なアルゴリズムのゲームなどあったら教えてくださいお
シューティング
オセロはどうだろうか?
218 :
476 :2009/02/21(土) 19:56:42
オセロむずかしそうだしってゆうか石取りゲームにしようかとおもいましたが 石取りゲームとか頭すごいつかいそうなのでちょっとやです シューティングは楽しそうです シューティングとオセロのほかにありますか?
クイズつくって満足してろ
221 :
デフォルトの名無しさん :2009/02/21(土) 20:02:18
最初は○×ゲームくらいのものを作った方がいい
ゲ製板に段階学習スレがあるからそこでレベル1から順に作ればいい それができないなら言語そのものの学習が上手く言ってないから 勉強しなおし ちなみにテトリスはHSP(ポインタや構造体がなく、再起数にも制限がある)でも 作れる
ターン制ゲームのほうが簡単ですか?
多分知識不足を主因とするネタの空振りなんだろうが うざい マスかいて寝ろ
>>184 先頭に、/* Copyleft. you are freelly modify, or rewrite, .... */ とか書いて、インターネットやnyに放流。
有用なソフトなら、誰かが改変、改良してくれるだろうから、1年後に捕獲、回収。
クズソフトなら、書いた奴が激しく責められ、なぜだめなのか、もうどうすることもできないのか、
などコメントされるだろうから、それを、そっと他人のふりして、上司に見せる。
227 :
デフォルトの名無しさん :2009/02/21(土) 22:45:07
総当りでコードを生成して先頭に、/* Copyleft. you are freelly modify, or rewrite, .... */ とか書いて インターネットやnyに放流するプログラムを作ればそのうち著作権なんて馬鹿らしくなってくるんじゃないでしょうか?
Copyleft. you are freelly modify, or rewrite この英語は釣りですか?
Copyleft - All rights reversed.
231 :
デフォルトの名無しさん :2009/02/22(日) 00:01:23
>>207 ビット計算は速い。
例えば最短ルートを探索する問題で32bitないし64bitで状態を記述してビット計算で解析する方が
普通に配列つくってループまわすよりダンチに速い。
もちろん単純なビット計算で状態遷移できるように工夫することが前提な。
ビット計算をループで回しとったら(それでも配列より速いかもしれんが)あんま効果ないで。
233 :
デフォルトの名無しさん :2009/02/22(日) 00:09:30
ないで。
>>232 ループ回す場合とループ回さない場合、ループ回さない方が速い
って言ってるだけでビット演算が速いことになってない。
235 :
476 :2009/02/22(日) 10:46:40
#include <stdio.h> #include <string.h> int main(void) { char *p[][2]={ {"test","up"}, {"gohan","ge"}, {"",""} }; int i; char u[80]; gets(u); for(i=0; *p[i]; i++) { if(!strcmp(u,p[i][0])) printf("%s is %s\n",u,p[i][1]); } return 0; } のfor(i=0; *p[i]; i++)こなんですが*p[i][0]だとうまく動くんですが *p[i]だけだとSegmentation faultとでてしまいます *p[0]は先頭の*p[0][0]と同じだと思うんですが。 Segmentation faultが出る理由はなんですか? 教えてください
**p[i]
char *p[][2]={ → char p[][2]={
>>235 だーら、typedef覚えてからにしろっつっただろ〜
相手すんな
>*p[0]は先頭の*p[0][0]と同じだと思うんですが。 違います
みんな476大好きだなw
>最後のラスボスはポインタです
244 :
◆YjsWqh8B4w :2009/02/22(日) 19:23:00
#include <stdio.h> int main(int void) { int n1 = 0, i; int n2 = 0, a; double ax, b; double ay; for( i = 0; i <100000000 ; i++ ) { double ax = ( ((double)rand() / 32767) * 100.0); double ay = ( ((double)rand() / 32767) * 100.0); a = (ax-50.0) * (ax-50.0) +(ay-50.0) * (ay-50.0); if( a <= 2500.0 ){ n1++; }else{ n2++; } } b=4*n1/(n1+n2) printf("πの値は %lf\n", b); return 0; } 長文すみません。 縦横100の四角形の中に半径50の円が入った場合に、 モンテ法を用いて、円周率πを求めるプログラムを作ったのですが、 実行結果がπ=3.88942等の円周率と離れた数値になってしまいます。 このプログラムの内容をなるべく変更しないで正しい値に近い円周率を出すためには、 どうしたらいいでしょうか。 協力お願いします。
これ宿題スレのじゃねーか?
しかもちっともCを理解していない事がよくわかるなw
>>244 試しにすべてのポイントで計算して見てごらん
>>244 #include <stdio.h>
int main(int void)
{/*
int n1 = 0, i;
int n2 = 0, a;
double ax, b;
double ay;
for( i = 0; i <100000000 ; i++ )
{
double ax = ( ((double)rand() / 32767) * 100.0);
double ay = ( ((double)rand() / 32767) * 100.0);
a = (ax-50.0) * (ax-50.0) +(ay-50.0) * (ay-50.0);
if( a <= 2500.0 ){
n1++;
}else{
n2++;
}
}
b=4*n1/(n1+n2)
printf("πの値は %lf\n", b);
*/
printf("πの値は %f\n", 3.14159265358979);
return 0;
}
こんなかんじでどうだろうか
<stdlib.h>もインクルードしろ。 aもdoubleにしろ。 32767とマジックナンバーを書くな。RAND_MAX使え。 b = の右側の4を4.0にしろ。
#include <stdio.h> #include <math.h> int main(int void) { int n1 = 0, i; int n2 = 0, a; double ax, b; double ay; for( i = 0; i <100000000 ; i++ ) { double ax = ( ((double)rand() / 32767) * 100.0); double ay = ( ((double)rand() / 32767) * 100.0); a = (ax-50.0) * (ax-50.0) +(ay-50.0) * (ay-50.0); if( a <= 2500.0 ){ n1++; }else{ n2++; } } b=4*n1/(n1+n2); if(b != 3.14159) { b = acos(-1); } printf("πの値は %lf\n", b); return 0; }
プログラムだけじゃなくて諮問もあるんだろ わからんことは聞いておいた方がいいんじゃないか?
>>249 >>250 ありがとうございます。
プログラムの中のacos(-1)の部分が良くわからないのですが …
なぜbがπでない場合そうするのでしょうか??
b = 4.0*arctan(1); でもいいよ
>>int n1 = 0, i; >>int n2 = 0, a; なんかさ、相関のないものをこういう風にまとめるのって 頭おかしいんじゃないかと思う ちなみに、プログラムがおかしい原因は intとdoubleの混在。 rand()をdoubleでキャストしたときの知恵を他にも回せ
皮肉も通じないとは (自分も含めて)ゆとりは高校でarcsinとかを習わないからなあ 一言、sinの逆関数ですよって説明するだけなのになぜ省かれたのだろう
ありがとうございました。
sinやarcsinなんて知識に過ぎない。少なくともプログラミングの世界では。 モンテカルロ法を議論する場合は三角関数の一定以上の学識は必須。 したがってモンテカルロ法がプログラミングの例題として適しているかどう か今一度議論されてしかるべきということになる
しかしそれはこのスレの範疇ではない
2年くらいC使ってるけどモンテカルロ法なんて聞いたことも無い
260 :
デフォルトの名無しさん :2009/02/22(日) 22:59:28
数値計算しなければ使わないかもな でも2年も使ってれば一度くらいお目にかかるだろ
いいとこの学校だと、前期がC言語入門で後期は数値解析だもんな・・・ オレんとこはオバカ学校だったけど、時間配分半分とか見ると、愕然とするな。
なんか生徒がいつ発狂するかテストしてるみたいなカリキュラムだなw
MCくらいなら元になる数学と併せてマスターするのに1週間かからないような 専攻が物理だったからかなぁ
うちは1年で前期パソコン入門後期C言語、2年でフォートランと数値解析、3年で物理シュミレーションだったな
30分で深海100mまで巣潜りしてくるようなカリキュラムだな
このスレ的に高専ってどうなの?
どうって?
マクロの問題です。 #define MAKE_AAASTRUCT() AaaStruct a##__COUNTER__ MAKE_AAASTRUCT()を実行すると、自動的にAaaStruct a1, AaaStruct a2, AaaStruct a3,,,となって欲しいのですが、うまくいきません。 どのようにしたら良いのでしょうか、、、
>>269 マクロは実行するものではなく置換するものであることを忘れないこと。
Cプリプロセッサに変数という概念は無い。
よって置換を行うたびに動作を変えるようなマクロもありえない。
任意個数の異なるオブジェクトの実体が必要なら、メモリを動的に割り当てる方法を試すこと。
271 :
269 :2009/02/23(月) 02:09:34
ごめんなさい。出来ました。 #define _JOIN( X, Y ) _DO_JOIN( X, Y ) #define _DO_JOIN( X, Y ) X##Y #define MAKE_AAASTRUCT() AaaStruct _JOIN(a, __COUNTER__)
>>269 #define MAKE_AAASTRUCT_SUBSUB(COUNTER) AaaStruct a##COUNTER
#define MAKE_AAASTRUCT_SUB(COUNTER) MAKE_AAASTRUCT_SUBSUB(COUNTER)
#define MAKE_AAASTRUCT() MAKE_AAASTRUCT_SUB(__COUNTER__)
どちらかというとかな〜り邪道なマクロの使い方
どんだけ特殊な事情なんだ 普通に配列でいいじゃん
>270が何か勘違いしてるのはいいとして、こういうマクロって何の役に立つの?
276 :
269 :2009/02/23(月) 02:44:43
マクロのことでCのスレで質問したのですが、本当はC++で使いマクロでした。 適当なブロックの先頭で宣言して、ブロックから外れたらデストラクタが動いてくれるような、あくまで一時的なクラスの名前付けをラクしたかったので、、、
277 :
269 :2009/02/23(月) 02:45:15
> 使いマクロ -> 使いたいマクロ
278 :
デフォルトの名無しさん :2009/02/23(月) 06:56:49
windowsで使用できるメモリアドレス空間の範囲ってどうすれば分かりますか? プログラムつくって変数にアドレス振る時とか、0x0000000とかだとふれませんよね
>>279 おまえが振るわけじゃないから、そんなことは考えなくても大丈夫
大丈夫かどうかじゃなくて「どうすれば分かるか」を、知っている人 に尋ねた。
何でもかんでも知っている人に聞くより、自分で調べられるようになろうね。
初心者だとすると、それを知りたいという時点で すでに問題解決の方向が間違ってる
Windowsだとことわりがあるだろ? 知りたくもないことまで知らなければならなくなる 状況が時々発生するのがWindows開発 だからWindows開発は初心者向けじゃ絶対にない
スレ違い の一言ですむだろう
>>279 IsBadReadPtr/IsBadWritePtr系APIを使えば?
標準Cライブラリにその手の関数は無いが
Windows開発やってて、メモリアドレスの範囲を知らない時点で終わっていると思うが
WindowsのCで、どうやって任意のアドレスに変数を割り当てるのだ?
メルセンヌツイスタって下位何bitだけ取り出して〜とかでも乱数として使える?
int x[10][10]; int i; int *p = x[0]; /* x[0] は、最初のデータへのポインタである。 */ /* だからその型は int * なので、代入できる。 */
質問です。 要素を変更するプログラムについて、 char array[] = "hoge\n"; array[2] = 'G'; これはOKなのですが、 char *str = "hoge\n"; str[2] = 'G'; はセグメンテーションエラーになります。 何でですか?
前者はローカルの配列にコピーされるが、後者は書き込めない位置にあるから。
C言語を使うのが楽しいのですが、
soudesuka
>>293 BCCだとエラ−にならずに書き換えできたりするんだよな
>>288 そんなもの知る必要の無い仕事のほうが圧倒的に多いし
少なくともそれはCの言及する範囲の話題ではない
文字入力(標準入力)の最善策って、 全てscanf("%s",tmp); と受け取って後で処理する事?
scanfをそのまま用いるよりはfgetsを使った方が良いよ
302 :
デフォルトの名無しさん :2009/02/23(月) 17:43:08
色々バグがあって困ってるんですが、 scanf("%d",&a); は文字入れた瞬間にいかれちゃうんで scanf("%s",&str); ->strを整数や実数へとしてるんですが scanfはバグが多いと、よく聞きます。 より良い方法や、数値などのより(バグの無い)効率の良い方法とかって、ありますか?
バグが多いというのは適切じゃないけどね、きちんと動く
扱いづらい面が多いだけで
>>303 改行がバッファに残る、バッファオーバーラン等の対処などから、
fgetsしたものをsscanf, atoi, strtol等を使って解析するのが定石
pthread_createでスレッドを作って、そのスレッドでexec関数を呼びたいんですが、 forkすると、スレッドとプロセス生成でややこしくなります。 マルチスレッドとforkは混ぜるな危険でしょうか?
forkのすぐあとにexecすればなんとかなるかも
308 :
476 :2009/02/23(月) 18:18:53
scanfは危険など使わない方が良いと書いてあるのを見かけるんですが 数字などを入れるときはscanf以外の関数はあるんですか? なぜだめなんですか?
>>308 wikipediaでscanfを調べてみなさい
>>310 マルチスレッドでforkするときはいろいろお約束があるけど、
呼んじゃいけない関数を呼ぶ前にexecしてしまえば問題が出ない。
>>301-305 fgetsって、ファイルだけかと思って、
ファイル入力&読み出しとかめんどくさいし、ゴミも・・・・・
と思ったら、ファイルポインタにstdin指定が出来るんですね。
get〜 にも悩まされずに済みそうです。 ありがとうございました。
313 :
デフォルトの名無しさん :2009/02/23(月) 21:13:36
何をどう直せば正常に動くのかわかりません。 最後のprintf文の最初の出力文字を大文字にしたい。 #include <stdio.h> #include <ctype.h> main() { char *fruits[]={"apple", "orange", "kiwi"}; int i; printf("Suppose that we now have (0) %s, (1) %s, (2) %s.\n", fruits[0],fruits[1],fruits[2]); printf("Input 0, 1, or 2: "); scanf("%d",&i); *fruits[i]=toupper(*fruits[i]); /*ここがエラー*/ printf("\n%s is your favorite fruit!\n",fruits[i]); }
よく見てないけど char *fruits[]={"apple", "orange", "kiwi"}; を char fruits[][300]={"apple", "orange", "kiwi"}; にしたらどうかしら
>>313 *fruitsは書き換えできないから適当なバッファを用意してコピーしろ
char buffer[256];
strcpy(buffer, fruits[i]);
buffer[0] = toupper(buffer[0]);
#include <stdio.h> #include <ctype.h> #include <string.h> main() { char *(fruits[])={strdup("apple"), strdyo("orange"), strdup("kiwi")}; int i; printf("Suppose that we now have (0) %s, (1) %s, (2) %s.¥n", fruits[0],fruits[1],fruits[2]); printf("Input 0, 1, or 2: "); scanf("%d",&i); *(fruits[i])=toupper(*(fruits[i])); /*ここがエラー*/ printf("¥n%s is your favorite fruit!¥n",fruits[i]); } 慣れないうちは()を付けること 格好つけて()を省略してツウぶるのはやめような
317 :
デフォルトの名無しさん :2009/02/23(月) 21:33:30
複素数を二つ読み込み、和を求めるプログラムを作っています。 コンパイルも出来て実行も出来るのですが、実行した結果が0.000000+0.000000iとなってしまいます。 どこでミスしているのかわからないので教えてください。よろしくお願いします。 #include<stdio.h> struct cmplx{ double real; double imag; }; void add(struct cmplx c1, struct cmplx c2, struct cmplx s) { s.real = c1.real + c2.real; s.imag = c1.imag + c2.imag; } int main(void) { struct cmplx c1, c2, s; puts("Input Two Imaginary Numbers."); printf("A real:"); scanf("%lf", &c1.real); printf("A imag:"); scanf("%lf", &c1.imag); printf("B real:"); scanf("%lf", &c2.real); printf("B imag:"); scanf("%lf", &c2.imag); add(c1, c2, s); printf("Sum = %f + %fi\n", s.real, s.imag); return 0; }
strdyoはご愛嬌ということで あと処理系によってはコンパイルとおらないかも (ポインタ配列の関数呼び出しによる初期化不可)
>>317 引数を書き換えても反映されない、
アドレスを渡すとか返り値を使え
>>317 void add(struct cmplx c1, struct cmplx c2, struct cmplx *s)
{
s->real = c1.real + c2.real;
s->imag = c1.imag + c2.imag;
}
add(c1, c2, &s);
なんで構造体のポインタだと->なんだ?(言語仕様的な意味で) *struct.fieldでいい気もするんだが。
>>317 >>321 さんのでもいいけど
struct cmplx add(struct cmplx c1, struct cmplx c2)
{
struct cmplx s;
s.real = c1.real + c2.real;
s.imag = c1.imag + c2.imag;
return s;
}
mainで
s = add(c1, c2);
のほうがいいかな?addが関数っぽいし。
324 :
317 :2009/02/23(月) 21:45:32
>>320-323 いろいろと助言ありがとうございます。
とりあえず
>>323 さんのが一番単純なので使わせていただきます。
ありがとうございました。
Windowsでは嫌われる
ソースコードレベルでローカルな名前空間にある構造体を 返すことが
すれちかもしれないけどここで質問 秀丸のtagファイルを全階層のディレクトリ分、関数もヘッダも一通り作るにはどうすれば? やはり手動?
どっちかっつーと
>>321 の方に慣れといたほうがいいぞ
>>323 だと速度遅い
今回の例だと気にするほどではないかもしれないが。
>格好つけて()を省略してツウぶるのはやめような これはおk
逐次コードにシケイン築いてオレ凄いとかふんぞり返る
>>329 みたいなのが居るんだよね
329!=330なんで 念のため
329は間違ったことを言っているわけではないが Windows優勢のこの時代においては という但し書きが必要
Windowsがどう関係するの?
t += dt みたいに、文字列の追加連結を char str[256] = "ABC"; 〜処理〜 sprintf(str , "%sDEF" , str); ってやろうとしたんだけど、うまくいかなです。 どうも、%s読む前にstrが初期化されてる 気がするんだけど、そういう事? str = strcat(str,"DEF"); が無難?
336 :
デフォルトの名無しさん :2009/02/24(火) 00:57:04
strncat()が無難
strncatを使え
>>335 sprintf()に渡すバッファと書式のポインタは、他のポインタと同一では
いけないと規格で決まっている。
339 :
デフォルトの名無しさん :2009/02/24(火) 01:04:45
char* a = malloc(100); ++a; free(a); って問題ある?
>>339 ある。
即時にクラッシュしないかもしれないが、ヒープが壊れたりしてヒドい
ことになる。
342 :
デフォルトの名無しさん :2009/02/24(火) 01:11:36
>>341 特定の実装でどうなるかという話ではなくて、
Cの規格でダメだと決まっているの?
343 :
デフォルトの名無しさん :2009/02/24(火) 01:13:34
MANPAGEに書いてた。ありがと。
>>342 ISO/IEC 9899 で決まってます。
ある種の仕様の問題が改善されないことを規格で決定するのか?
strlcatを使え。 なければ作れ。
347 :
デフォルトの名無しさん :2009/02/24(火) 01:19:58
std::string::operator+=()でおk
>ある種の仕様の問題が改善されないことを規格で決定するのか? そうその通り free関数は例え引数ポインタがmallocで確保されたメモリブロックを 指していてもそのメモリブロックを解放するような(親切な) 実装をしてはならないことに決まっている...ようだ
349 :
348 :2009/02/24(火) 01:26:34
>free関数は例え引数ポインタがmallocで確保されたメモリブロックを >指していてもそのメモリブロックを解放するような(親切な) >実装をしてはならない free関数は例え引数ポインタがmallocで確保されたメモリブロックを 指していてもそのブロックの先頭を指していない限り そのメモリブロックを解放するような(親切な)実装をしてはならない に訂正
まじでそんなこと書いてあるのか? 単に未定義なんじゃなくて?
ふつうそうだろ。 1万円借りたら1万円返す。9千円で済まそうとしてはいけない。
mallocしたポインタ以外をfreeしたらたぶんダメ、でいいだろ。
353 :
335 :2009/02/24(火) 01:46:06
>>346 strlcatの使い勝手は分かった。確かにその都度自作関数でも十分価値あるのは理解。
>>347 stringクラスは、C/C++の文字列扱いの不便さ解消してて、すごいとは思ってたんだが
今は、string使うのが当たり前なのか?
細かい作業とか、他人のソースとか結局char配列で文字列を宣言すること多いなら
しばらく、手を出さずにいようかと思ってたんだけど・・・・
貸したお札のキ番号が異なった場合や硬貨の製造年月日が異なった 場合、例え同一の金額、それ以上の金額であっても受け取ってはならない と定めているのと似てるなw
お札の番号が違うから受け取れない、って言われたら多分一生返せない。 利子だけが雪だるま式に・・・・ 新たな貸金商法ですね?
strlcatとそのまま自前で作ってもいいけど 移植性を考えたらstrLcatとかちょっと名前変えておいた方がいいよ。
部屋を貸して返ってきたのが元の部屋9割と隣のおじさんの部屋1割だったら嫌だろ?
>今は、string使うのが当たり前なのか? 当たり前っちゃ当たり前だけどchar *で間に合うならそれで済ませたほうが簡単 つーかここはCスレだし
なんか的外れな例えする奴が沸いてるなw
でも面白い
でも確保したうちの9割しか解放されないのであれば、 テストとかすぐ終わるプログラムにしか使えないじゃないか。 長時間滞在するデーモンプログラムとかメモリリーク起してえらいことになる。
reallocを使いまくってるプログラムに似てるかもね。
>>356 それ、元の分以上には何も返ってこないんですけど(番号の違うものは受け取れないから)、そんな商売に何のうまみが。。。
って、何の話してんの?
でも、1万円借りて110ドルで返そうとしても型が違って拒否られるよね。 円でキャストしないと。
367 :
デフォルトの名無しさん :2009/02/24(火) 02:33:07
ごめん、円でキャストしたら110円しか返さないw ageてわびます。
>>366 金の勘定ができない奴に使える詐欺かもね。
ぶっちゃけプログラミングで一番悩むのってネーミングじゃね?
あるある
疲れてきたらかなり適当になる
ということで、
>>367 //円をドルに換算する
doru en_to_doru(en e,doru d){
}
誰か中身おね
return e * d;
中身 { return Google(e,"を",d,"へ"); }
ドルに変換するのに、なんで引数にもドルがあるんだよw
dollar en_to_dollar(int en,int rate){ return en*rate; }
呼び出し側でドルに換算するんですね、おkです。
漢字の識別子が使えればいいのに
使えるよ、C99から規格でも保証されてる ただ・・・・・・・・・
話がずれてる 未定義の一言で済ませればいいのにわざわざ規格として禁止してる意味はなにかってことだろ
規格として禁止してるの?
禁止ってなんだ?
iostreamよりstdioのほうが使いやすくない?
ネットって皮肉が伝わりにくいよなw
未定義と定義した段階で、改善勧告を出さないという意味になるので
JISの定義は
>>349 辺りとさほど変わりが無い件について
まぁ free( (void*) ( (char*)malloc(1024)+1) );
がヒープ壊すのをfreeの問題かプログラマの管理の問題かは
議論が分かれるとこだろけどな
>>387 要求しないのと禁止するのはぜんぜん違うだろ・・・
389 :
デフォルトの名無しさん :2009/02/24(火) 14:46:09
>>387 その free は何をしても「問題ない」
未定義の意味わかってるか?
JISの規格ってのはある時点の現状報告書なのか?
処理系によっては、
>>387 のfreeは正常に動作し
処理系によってはヒープを壊すなどの障害が発生
だから未定偽
すべての処理系に共通の動作保障が得られている
ものを「定義」すると表現しているようだw
11.34: ANSI規格には多くの論点が未定義のまま放置してあることを考えるとぞっとする。 規格の仕事はこれらの問題を標準化することではなかったのか。 A: C言語は昔からその一部はコンパイラやハードウェアがどう実装されて どう振る舞ってもいいようになっている。こういうふうにわざとはっきりさせないことで、 コンパイラはありそうもないような状況にまで適切に定義された動作を保証することのために すべてのプログラムに余計なコードの重荷を背負わせることなく、 よくある状況で効率のいいコードを生成することができる。 よって規格はそれまでに存在した習慣を単に明文化したにすぎない。 プログラミング言語の規格は言語の使用者とコンパイラの実装者の間の条約と考えればいい。 その条約の一部はコンパイラ実装者が提供を約束した機能で、使い手は用意されているものだと思いこんでいい。 しかしながら、別の部分はユーザーが従うと約束した決まりで、実装者は守ってもらえると思いこんでいい。 両方が自分の約束を守るかぎり、プログラムは頑張れば動く可能性がある。 どちらかでも公約を破れば、どんな部分についても確実に動くとは保証できない。
どんなコンパイラメーカーwもJISとは法的契約を結んでいるわけじゃないです JISのお墨付きが貰えないというだけでANSIのお墨付きがもらえれば別にいいです
多用されてるというだけでそれぞれ暫定的であった可能性が高いキーワードを 勝手に仕様を定義して固定化してしまうことの負の影響について考えてみよう
大体にして標準ライブラリと言ったところで、私物に近いものだったのだが それを勝手に公有物のように扱い動作仕様にまで干渉する人たちって一体...
規格が気に入らないなら勝手に好きな仕様で処理系をつくればいい そんなこと誰も禁止していない
>>396 気に入らない仕様(規格)を独断的に性急に規格にしてしまったから問題なんだろ?
>>398 ベンダーが明文化する程度に留めて置くべきだったものを、皆でよってたかってどんどん明文化し
挙句の果てには無責任に自分が作ったかのように文法書や教科書まで作って布教してしまう
奴らに怒ってるだけだろ
怒るのは勝手ですがよそでやってください ここはそういうスレじゃないんで
ここに同姓同名の人達が居て、皆、息するかウンコする位しか 共通部分は無かったとする。(男も女も居た) たまたまある瞬間、*非同期に*(相互連絡はもちろん面識すら無い状態で) 共通のちょっと珍しい行動を行った (例えばあくびをする時に、腕を後ろに反らした) その同姓同名の人達の共通仕様はあくびの時の動作であると定義されて しまった。以降同姓同名の人は、みな、例えばあくびの時に腕を後ろに 反らさなければならないと規定されてしまった。 こういうのと似てるんだよね。
ぜんぜん似てねーよ
ANSIをカスラックか何かと勘違いしてるんじゃないのか 規格化の経緯を妄想するのは勝手だけどね
1つ質問があります。 void型変数を含む構造体があったとします。 その構造体のメモリを動的に確保した上で 構造体内のvoid変数を違う型にキャストした場合 メモリはちゃんと確保されるのでしょうか。
>>404 「void型変数」は存在できないはずです
void型変数??????????
キャストとメモリ確保の相違について
エスパーしようと思ったが何を言いたいのかさっぱりわからない
わからないのなら答えなくても結構
410 :
デフォルトの名無しさん :2009/02/24(火) 18:47:06
malloc が返した void* をキャストしたら境界要求は守られるのかってことじゃないか?
void変数があるって事はC言語じゃないな つまりスレ違いだ
>>410 自動で領域確保されると勘違いしている可能性が高い
ある型のサイズをmallocに渡した結果得られるvoid*のことを キャストと言い、またその行為をキャストすると表現するのなら 問題は全く無いな。
キャスト:ある型のサイズをmallocに渡した結果得られるvoid*のこと
キャストする:ある型のサイズをmallocに渡してvoid*を得ること
void型変数を含む構造体があったとします。
その構造体のメモリを動的に確保した上で
構造体内のvoid変数を違う型にキャストした場合
メモリはちゃんと確保されるのでしょうか。
↓
void型変数を含む構造体があったとします。
その構造体のメモリを動的に確保した上で
構造体内のvoid変数を違う型にある型のサイズをmallocに渡してvoid*を得た場合
メモリはちゃんと確保されるのでしょうか。
???
>>413 日本語でおK
>>413 その言葉の意味するところが分からんな
ちょいと英語で言ってくれんか
>>413 int i=234;
double d=(double)i;
こういうのをキャストと言って、決してコンバージョンとは言わないのだよ。
間違えました。すいません。 正しくはvoidではなくvoid*でした。
>>413 Cのキャストは万能
例えば次の式もどのような処理系でも
正しく評価され{}は実行される筈
if( (int)3==(int)(long)(double)(long)(float)3){
hoge();
}
>>419 どのみち、メモリが確保されるかどうかとは関係なくね?
NULLはキャストされないな
>>422 するだろ、しないとだめなケースもあるだろ
>>423 C言語ではポインタとして使う限りキャストは必要ない
(int*)NULL とか書いたことないな
>>404 void*を含む構造体をその構造体としてキャストし、
更にその中のvoid*項目を任意の型にキャストしてから
使ってください。
構造体キャスト直後はvoid*項目は恐らくアクセス不能な
ポインタ値が入ってるので、キャストしてから使って
下さい。
>>404 は void* を持ってC++継承機能相当の実現を狙ってるんだろう
出来るよ。
うーん 例えば typedef struct _isono { SDL_Surface *img; int id; int sazae; int masuo; int katuo; int wakame; int tara; int tama; double x,y; void *okazu; struct _isono *otonarisan; } ISONO; というものがあります。 これを ie = malloc(sizeof(ISONO)) で確保して。 その後 int mezasi=500000; (int *)ie->okazu=&mezasi; とした場合mezasiは保持されるのかという話なんです。 分かりにくくてごめんなさい。
回答者 わかる愚問 喜んで 回答者 わからぬ問題 ググレカス
>>434 メザシのスコープが残ってる間は大丈夫。
_wsplitpath_s にバグっぽいものがあるような気がします。俺だけ? wchar_t FullPath[] = L"\\\\?\\d:" wchar_t Drv[100]; _wsplitpath_s(FullPath,Drv,sizeof(Drv),NULL,0,NULL,0,NULL,0) // 失敗。 戻り値は0で、Drvには何も書き込まれていない。(きちんと分割できてない) 文字列の先頭に\があるせいかとも思ったが、下の例は成功する wchar_t path[] = L"d:\\kuro01.wmv" wchar_t FileName[1025],ext[257]; _wsplitpath_s(path,NULL,0,NULL,0,FileName,sizeof(FileName),ext,sizeof(ext)); // 成功。 戻り値0 XP SP3 + VC++ 2008 Express Edition 同じ戻り値0で文字列が\で始まってるのに、動作が違う!ふしぎ! ・・・なんで? ちなみに、FullPathからFullPath+4に変えてやると成功する。
>>436 おお
そうですか
素早い回答有難うございました。
>とした場合mezasiは保持されるのかという話なんです。 そのアドレス値をポインタ値に変換されて他のポインタ変数に 入れたら値が消滅してしまうとすると、恐ろしくて誰もC等 使わないと思います。
440 :
437 :2009/02/24(火) 20:43:19
すみません。 "d:\\kuro01.wmv" ではなく、 "\\\\?\\d:\\kuro01.wmv"の間違いでした。 失敗するのは俺だけ? 誰か検証してみてください。
使用者と(その可能性は若干薄いが)作成者が共に仕様に関して不安定な 部分を持っている状況では安易にバグとは言ってはいけない てか完全にAPIスレの話題
>>437 前者はドライブ名で後者はファイルと拡張子とまったく条件が違うが
>>437 FullPathがドライブ名で始まってないのだから空文字が返されて正常終了で当たり前と思う
"\\?\"がディレクトリとして分割される そもそも_wsplitpath_sでそんな形式サポートしてないだろ 引数も間違ってるしちゃんとMSDN読めよ
"\\\\?\\d:\\kuro01.wmv"でもドライブ名は空になると思うぞ てか \\?\ ってなんだ
これからはAPIの質問もここでおkですね
環境依存スレいけ
否、APIに関しちゃ(試行錯誤の)経験(だけ?)がものすごく重要だから 「俺に聞け」スレだな
>>434 (int *)のキャストはいらない
標準の処理系じゃコンパイル通らないし
×標準の処理系 ○規格に厳格な処理系
いらないというより、キャストしただけでは左辺値にならないわけだが。
キャストされたポインタは 左辺値になることは今のところは許されるが 将来はエラーになる可能性がある と警告を出すのがgcc だが逆の予想もあるかもなw 「キャストならぬ実際には元の型を非可逆的に変換してしまう 型変換演算子を介して他の型の値を読み込むことはエラーにな る可能性がある。」
refConフィールドとか
458 :
デフォルトの名無しさん :2009/02/25(水) 03:08:25
mallocとは、なんとなくですがC++でいうnew見たいなものでしょうか? もちろんコンストラクタとかはありませんが、その指定した分のメモリを ヒープに割り当てて、ポインタで使えるようにするというのは、 あたらしくオブジェクトを作ることに似ていると思ったのですが...
>>461 gcc4.3.3では、
error: lvalue required as left operand of assignment
になった。古いのは知らん。
GCC3.4.5は -Wall を付けても warning だった
_cprintfみたいに_とか_cとかがついてる関数って元の関数とどう違うんですか?
出力先が違う・・・ マニュアル読め
466 :
476 :2009/02/25(水) 20:15:23
C言語でウイルス駆除ソフトみたいな感じで ロックマンなど作れるでしょうか? ロックマンの活動源はプログラムのコードで、ロックバスーターなどC言語で書いたりして強くすると ウイルスを駆除しやすくなるなど、C言語で書いて新しいロックバスターなどをつけたり ゴミデータでロックマンの体力をあげたり そういうのって実際つくれるんですか?
エグゼのほうかよ
>>466 C言語では不可能です
あきらめましょう
470 :
デフォルトの名無しさん :2009/02/25(水) 21:31:45
C言語でおk
471 :
476 :2009/02/25(水) 21:46:35
ひまなので書きました #include <stdio.h> void ango(char *p); int main(void) { ango("aiueo"); return 0; } void ango(char *p) { while(*p){ printf("%c",*p+9); p++; } printf("\n"); } インクリメントのことなんですが printf("%c",*p+9); p++; これを *p++みたいにやりたいんですが (*p+9)++とやってもだめで *(p+9)++これだと配列の要素9を繰り上げてしまうのです どうすればいいんですか?教えてください
472 :
476 :2009/02/25(水) 21:48:15
自己解決しました printf("%c",(*p++)+9); でできました
*p+++9
if(n==0){〜} と if(!n){〜} は完全に等価だと思っていいですか?
>>479 nはマクロでなく通常の変数を想定しています。
が、もしマクロで異なる場合があるとしたらそれはどんなマクロですか?
#define n a=b
あ、なるほど。 それは想像してませんでした。 ありがとうございます。
まあそんなアホなマクロ書くやつはいないだろうけどな…
レアかどうかは置いておいて、 言語スレで「完全に等価」か、と聞かれたら 否定せざるをえないでしょ
すいません、初歩的な質問です。 static char *ptr = "abcdefg"; のstatic宣言で確保される静的領域はポインタ領域(4バイト) だけなので、"abcdefg"はレアケースでぶっとびますよね??
ぶっ飛びません。
"レアケースでぶっとぶ"ってどういう意味
ポインタ宣言時に初期化で確保された文字列はconst領域という読み取り専用の特殊な場所に保存される。
ptrの領域としてsizeof(static char *)バイト "abcdefg"の領域としてsizeof("abcdefg")バイト 確保される。
>>485 ポインタと文字列がまだごっちゃになっているっぽくない?
この世(C言語)に文字列など存在しないのだよ。
#define if(b) if(!(b))
494 :
485 :2009/02/26(木) 00:39:08
即レスの多さにビックリ!
組込屋なので
>>485 の発想をしてしまいました。
レアケース例=プログラム実行中にメモリが枯渇して
他プロセスがメモリ消費するケースとか。
>>488 >>489 ベストアンサーsです。どうもありがとう。
わかるでしょう
ここに住人は
>>485 のようなレスを待ちわびているのです
>レアケース例=プログラム実行中にメモリが枯渇して 他プロセスがメモリ消費するケースとか。 ないない
const領域とかねーわ 書き換え可能である保証がないだけだろ
書き換えはできない。 環境によっては書き換えを無理やりやろうとするかもしれないが、深刻なエラーを引き起こす。jkだろ
普通読み取り専用として考えるわな。 無理やり変更できる環境は見たことない。
他のプロセスがメモリを侵略してくることを想定したら、防御策なんてあるのか?
PC(いわゆるIBM互換機)には定数格納用のEPROMが搭載されていてconst宣言された定数はここに書き込まれる。 EPROMはROMなので通常定数が消される心配はない。 ただし、EPROMの要領は限られているのでPCのブート時(リセット)に紫外線を照射して内容を消去している。 長時間PCを利用していると不安定なるのはEPROMの容量が枯渇するためだ。 リセットが短すぎるとEPROMの内容が消去されない可能性があるのでリセットは十分長押しすること。(5秒以上が望ましいとされている)
防御も何も、資源食い尽くせばみんな死亡だろうが。
昔の組み込みだと、コードや定数データは ROM に格納されることがあったけど 今はどうだろうね。どっちにしろ環境依存だし、自分が作ってる環境がどうなのかは 組込屋なら当然知ってるはず
プラットフォーム、コンパイラやバージョンによっても異なると思うが、 VC 2008 の場合、文字列定数は CONST セグメントに置かれて、 書き換えようとするとセグメンテーションエラーになる
定数を格納する領域のセグメント属性をユーザーレベル書き込み不可にしているだけだろ 組み込み系などではどこでも書き込めてしまうのがある
規格上は必ずconstであるわけではないよ たいていそうだけど
けっきょくOSによる。
>>503 いや、リテラル用にとった領域を他のプロセスが上書きするって環境らしいよ。
OSが入っているのかどうかも・・・
>>511 「文字列定数は書き換え不可の領域に配置される可能性がある」
515 :
485 :2009/02/26(木) 01:07:58
・・・レベル高い、勉強になる。
実は
>>489 を少し疑ったので自分なりに検証してみた。
>>489 の理論が正しければサイズさえ合っていれば通ると・・・
結果は、GCCでWarning吐くが通った。↓
#include <stdio.h>
static char *ptr1 = "abcdefg";
static int *ptr2 = "abcdefg"; // warning
static int ptr3 = "abcdefg"; // warning
main()
{
printf("ptr1= %s\n", ptr1);
printf("ptr2= %s\n", ptr2);
printf("ptr3= %s\n", ptr3);
}
>>514 書き換え不可の領域にどうやって格納するの?
まだ何か勘違いしてるような
>>499 昔のMSのコンパイラは書き換え可能領域に配置されていたよ
>>519 どの処理系でもいいから一例をあげてよ
本当にできるなら
>>521 一例も何も、実際やってみれば書き換えしようとしたらエラーになるからそれじゃダメなの?
配列の初期化とポインタの初期化は違うということだ。
へたな釣りだ
やっぱりポインタ関連は盛り上がるな!
>>523 だから、その書き換えしようとしたらエラーになるようなところに、どうやって定数を格納するんだよ
>>521 そんなことは知らない
規格が定めているのは書き換え可能である保証がないことだけであって
各処理系が実際にどう扱ってるかなどは関知するところではない
>>527 「おれは腕が無いのでOSのソースコードを読んで該当するところを説明してくれよ」
って言ってるのとほぼ同じだぜ。
本当に知りたいならlinuxのソース持ってきて読めばいいのに。
>>529 あるなら、あると言ってる側が示せよ。
無いものは示せない。
>だから、その書き換えしようとしたらエラーになるようなところに、どうやって定数を格納するんだよ 大抵は、初期化の時にOSが手配してくれるんだよ。 どうやってって質問は意味がわからない。
windowsもunixもそれぞれやり方があるだろうが、 一例を示すにしてもちゃんとやるならOSソースが必要。 それを説明してくれというならもうこの世界では誰も真面目に相手にしてくれない。
>>531 OSは書き換えられるんだろ?それなら書き換え不可の領域じゃないだろ。
あくまでもアプリからの書き換えが制限されている可能性があるというだけで。
ほら、できると言ってる奴は、OSのソースで、こうやってますって示せよ。
>>527 定数を格納するのはアプリケーションでなくてローダー。
アプリケーションは書き込めないがローダーなどのシステムプログラムは書き込める。
そういうことだろう。
こいつ受けるw
釣られすぎだ
そういや、ちょっと前に、strcpyを自作するって言って、 テストコードでリテラルを書き換えようとしているヤツがいたっけ。
正直、メモリ保護も知らない奴は半年以上ROMっててほしい くだらん議論でレスが進みすぎる
>>527 がいっている書き込み不可能の意味は、たとえば机の表面とか、俺が今食ってるおにぎりの米粒にとかそういうことだろ。
ソフトウェア都下のレベルを超えてるwww
>>541 まて、お前の米粒はそんなに固くなっているのか
難かろうが、柔らかろうが、アプリケーションごときが俺のおにぎりに書き込むことは不可能だ。
>>527 意味がわからん。一般的なOSでは、静的データは実行ファイルの中に含まれていて、プロセスが動作を開始する前にOSによってメモリ空間に展開される。
プロセス自身が自前で格納処理を行うわけじゃない。
>>533 あー、「書き換え不可」って言った場合、普通の人なら「その領域にアクセスしようとするプロセスから見て」という前提で考えるのに、
>>527 は「どこから見ても書き換え不可」って解釈したのか。
……本気で馬鹿なんじゃないだろうか。
明らかに馬鹿か電波か釣りなんだからスルーしろよ
>あるなら、あると言ってる側が示せよ。 >無いものは示せない。 悪魔の証明かよw 実際にあるけどそれを証明するのはお前の仕事。 いちいちかまってあげるほどPGは甘くない。
いいよもう とにかくみんな書き込むのやめろ
質問です。 マクロで関数を定義して使うのと、普通に関数定義して使うのだと、 それぞれメリットってなんでしょうか? マクロ関数は使いすぎると見ずらくて困るのですが。
×見ずらくて ○見づらくて
ふつうは関数型マクロあるいは単にマクロと言う
マクロ関数は呼び出しのコストがかからない
553 :
549 :2009/02/26(木) 02:19:05
>>552 ということは、性能的にボトルネックになりそうなところとかに使えば効果的ということですか。
>>549 マクロの利点:
・おそらく関数より処理が早い場合が多いだろうという期待ができる
・関数ではできない処理、たとえば
型に縛られない引数や型自体を引数に取ること
プリプロセッサによる特殊な動作
などができる
それ以外では関数のほうが大体有利
>>553 わからない
マクロは関数呼び出しのコストがないがそのぶんメモリイメージが増大して
結果的に遅くなることがないとはいえない
性能は実測で確かめること
555 :
549 :2009/02/26(木) 02:24:21
>>553 ボトルネックになりそうだと言っても、マクロを使うのは避けた方が良い
そういうところはinline関数で行うべき
C99にまだ準拠しないのが多い時代にinlineとか言われても
拡張子cppにするんですよw
struct Test{ char *name; }; int main(){ //構造体の配列を宣言 struct Test test[10]; //forループを使って代入するテスト int i; for(i = 0;i < 10;i++){ //test[i].nameに"No." と i を結合させて代入したい。i が3なら、"No.3" test[i].name = sprintf(test[i].name ,"No.%d" ,i); //整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 } return 0; } //test[i].name = reinterpret_cast<char*>(i); //C++のreinterpret_castを使うとコンパイルは通ったがprintfで表示させようとするとエラー 構造体の配列のnameをforループを使って連番で初期化できたら楽そうだな思って とりあえず上記までは書きましたが、ここから先は如何すればいいでしょうか?
#include <stdio.h> struct Test { char name[128]; }; int main() { struct Test test[10]; int i; for(i = 0; i < 10; i++) { sprintf(test[i].name, "No.%d", i); } return 0; }
>>560 即答、ありがとうございます
配列を使うんですね。再度、勉強し直して来ます
Cのコードを処理系が実行した場合に何が起こるかを「予言」 する文脈では、NULLや静的な変数以外へのポインタ などをアクセス不能(読み取り、書き込み不能)なものと 想定して議論をすることが多いが、これは経験値に基づく もので、これ以外にアクセス不能なものが無いことやそれ らのポインタ値が本当にアクセス不能なのかについては環 境依存な話となる。
その話題はもう終わったよ
>>562 正確には環境依存ではなく、状況依存だよ
プリプロセッサの小技とか、たまに教わると感動するんだが。 使うかどうかは別にして。 前にみたロベールのC++教室では #ifdef _DEBUG #define ONLYDEBUG #else #define ONLYDEBUG /##/ #endif。 とか。 いいね、プリプロセッサ。
>>565 そーゆーCのソースに見えないマクロはおじさん嫌いだな!
もちろんおじさんの個人的趣味だけどな!
CコンパイラはOSとプロセスの契約関係に過ぎなく プラットフォーム依存、環境、そして状況依存な メモリアクセス可能性については基本的に関知しない。 添付ライブラリマニュアルでは、アクセス可能性につ いて言及しているものがあるが、そのライブラリを 使用したことによってアクセス違反が発生したことに ついて、一律すべてにおいてユーザーが契約違反な メモリアドレスをライブラリに与えたと判定する ことは原理的に出来ない。
その話はもう終わったんだって何回言わせるの
単に #ifdef _DEBUG #endif のほうがずっとはっきりしていいと思うけどなぁ
気になる人には気になる話みたいだな
ONLYDEBUG より末尾が コメントアウトされる/されない : _DEBUG にて制御 (実利用頻度にもよるが)素直に #ifdef で挟む記述をしたほうが見やすいのでは?というところ
条件マクロの乱用は末期状態に近いことを意味する(経験則)
つまりそのソースは書き直したほうが良いということ
条件指定識別子の与え方のパターンで1万通り以上の バリエーションが発生するソースを誰が管理できるでしょうか?
578 :
576 :2009/02/26(木) 16:00:40
>>577 一万通りっておれそんなカオスなの見たことないww
それはさすがにクソだな
>>577 管理とは?
そのままの形では修正が極度に難しくなることは事実だが
直接コンパイルしたものを利用するからで、ソースの
ひな形として保管しておけばいいのでは?
cppとか使って平文wに直し、それを修正するなり
整形するなり加筆するなりして利用すればいいだけ。
2ちゃんだから、聞きかじりの誤った理論のみなのは仕方ない
1万通りってたかが14bitだろ その程度も扱えない奴は無能
符号あり整数型と符号なし整数型に、別の言い回しってある?
符号付き整数型/符号無し整数型 標準符号付き整数型/標準符号無し整数型
>>583 汎整数型とかいう言い回しなかったっけ?
>>586 bool型、char型、wchar_t型、符号付き整数型及び符号なし整数型をまとめて、汎整数型と呼ぶ。
汎整数型は、その同義語として整数型とも呼ぶ。
588 :
583 :2009/02/26(木) 20:48:11
みんなサンクス!
>>581 50万行のソースコード1万通りだと。合計50億行です
>>589 それが本当に50億行にしか見えないならもうプログラミングなんてやめろ
C言語でオブジェクト指向を模したオープンソースで参考になるもの何かありますでしょうか?
大きく出ましたね
>>591 何故わざわざC言語でオブジェクト指向?
それはともかく、以前オブジェクト指向言語であるRubyの処理系は
Cで書かれているとか聞いた気がする
最近は知らないけど
594 :
591 :2009/02/26(木) 21:14:10
いや、別にそういう風に組みたいのではなくて、 実際そういう組み方で作られているものって何かあるかなと思って。
perl6の処理系はhaskellで組んであるんだっけ?
597 :
591 :2009/02/26(木) 22:05:54
Cでガーべジコレクションって実装可能かな? 参照カウントをライブラリとして作っておくとか。
存在を知りたいならBoehm GCでググれ。
C で GC というと、Boehm GC が有名じゃない?
timerのような関数ってありますか?
標準ライブラリの話だったらあるわけ無いだろう。
マクロの多用っていいこと? マクロで処理すべき処理とマクロで処理すべきでない処理の一例を教えて。
組込み系でも安心して使えるGCライブラリってある?
605 :
476 :2009/02/26(木) 22:58:23
文字を10進数に表示する物をつくったんですが #include <stdio.h> #include <string.h> void henkan(char *p); int main(void) { char u[80]; gets(u); henkan(u); return 0; } void henkan(char *p) { while(*p) printf("%d-",*p++); } xx-xx-xx-xx-と最後に-が表示されてしまい ifなどで取り除こうかとおもったんですが難しくて配列も-が増えるので増えてしまうので どうすれば-を取り除くことができますか? strlenなどで数をかぞえて取り除こうかと思ったんですが 教えてください
getsを使うなとあれほど
void henkan(char *p) { if (*p == '\0') return; while (*(p+1)) { printf("%d-",*p++); } printf("%d",*p); }
>>604 上ででてるBoehm GCも含めて、C言語での
"安心して使える"GCライブラリはないような気がする
609 :
476 :2009/02/26(木) 23:08:45
607さん天才ですね そんな方法おもいつきませんでした いらついてさいしょに-表示して-xx-xx-xx-xx-にしようとしました 本当ありがとうございます
>>603 >マクロで処理すべき処理
出会ったことが無い。
>マクロで処理すべきでない処理
よくある例は
#define POW(x) ((x) * (x))
>>608 そっか。
ちなみにメモリコンパクションのライブラリってあるのん?
>>610 定数定義はCならマクロしか選択肢無いし、
だからといって即値を使うのは悪だし、
マクロで処理すべきだろう
#ifdef _DEBUG #define ONLY_DEBUG if(1) #else #define ONLY_DEBUG if(0) #endif という手もある。 else でリリースオンリーのコードも書ける。 ただし、片方では定義が消えてしまうものを含める事はできない欠点が。
ビット演算するときはマクロ使ってるな 64bitの変数を上位32と下位32にわけたり 論理->物理アドレスもマクロだな。俺が作った訳じゃないけど…
>>603 マクロでないと実現できないこともある
__FILE__ とか __LINE__ とか
>>603 プラットフォームやターゲットなど、環境の違いを吸収するのにはマクロで
処理することが多い気がする(関数名の差し替えとか)
例外はあるけど、それ以外ではできるだけ避けた方がいいと思う
>>612 enumで定数定義するというのもあるぜ。
少なくともマクロよりは健全。スコープの外側にまで影響しないしな
enum {HOGE = 100};
俺がマクロを使うのは、ナマで書いちゃうと行がクソ長くなるけど 内容自体は単純でしかもよく使うAPIの呼び出しとかだな 具体的にはWindowsのMessageBox()をラップしたり あとはもちろん型を引数に取ったり、同名のメンバを持つ違う構造体を引数に取ったり、 識別子を合成したり文字列に変換したりするような処理はマクロでなきゃできない
>>618 なんか汚いソースになるか、可読性の高いソースになるか、危なっかしいな。
…俺もやるけどw
数学の公式をマクロにしたりとか。 速度優先の最適化かければ関数でも速度は大差なんだろうけど。
>>620 いや、差はなくなるよ。あったとしても、僅差だな。
>>611 GC使うのはあきらめて、aprのメモリプールあたりでお茶を濁すとか。
623 :
476 :2009/02/27(金) 00:16:44
#include <stdio.h> #include <string.h> void henkan(char *p); int main(void) { char u[80]; gets(u); henkan(u); return 0; } void henkan(char *p) { if (*p == '\0') return; while (*(p+1)) { printf("%d-",*p++); } printf("%d",*p); } これなんですが 何故最初に*p=='\0' returnとやるんですか? aiueoと入力したら*pはaだとおもうんですが *p=='\0'これで一致したらreturnをしてますがどういう意味ですか? それとwhile (*(p+1)) { printf("%d-",*p++); } printf("%d",*p); *(p+1)はaiueoの場合iなのでiの場所が\0になるまでですよね? なんだかよくわからなくなりました 2回もprintfがつかわれてるので 詳しい方詳しく教えてください
君がgetsなんてつかっているからわざわざ安全にしてくれているんだろ いい加減getsを使うのやめろ
625 :
476 :2009/02/27(金) 00:23:56
何で怒るんですか? 独習Cでgetsでてたので文字列を読み込むときはgetsってかいてあったので
whileループをこう置き換えてみよう。 -- for (int ic = 0; p[ic] != '\0'; ++ic) { if (ic > 0) putchar('-'); printf("%d", p[ic]); }
gets使ったプログラムをgccでコンパイルしてみろ
>独習Cでgetsでてたので文字列を読み込むときはgetsってかいてあったので そんな本は早く捨てるんだ!
>>623 >何故最初に*p=='\0' returnとやるんですか?
getsで空エンターをたたいて、
""が入力文字列となったとき、
*(p+1)は不定となるため、その防御
'-' は(出力文字数 - 1)だけ表示する
なので、whileでは(出力文字数 - 1)回繰り返しを行い(文字+'-')を出力し、
最後に1文字だけ問答無用で文字だけを出力する
getsはVC++でもwarningが出るような
631 :
476 :2009/02/27(金) 00:31:34
たしかにgetsを使ったときエラーみたいなのはでますが 問題なく動きます 629さんわかりやすかったです! でもC言語が完ぺきになるまでgetsとかscanfは使って良いんですか? 他のでやるんですか?使ってはダメな癖とかつくんでしょうか?
getsの禁止の理由? 現代日本語作文で古文でしか現れない文語の単語を 使うなというのと似てる。 意味が取り違えられる可能性が大だし、まず正しく 使えない。
>>631 俺はいいと思うけどなぁ。
だって初心者だろ?
変に制限したら言語自体が嫌いになっちゃうよ。
…将来的には使わなくなると思いつつ使えば。
>使ってはダメな癖とかつくんでしょうか? わかってて使ってるならいいのかも知れなくもないが、 いまどきgetsを使えとはこれいかに。もはや後方互換のためにのみ存在する関数だろ。 char u[80]; gets(u); uに100文字くらい入れてみればどうなるか。 その現象をこの関数で防げるか。
スルーされる>626涙目(TT
>>632 そういう奥ゆかしいものじゃなく
いわゆる米俗語、つまりフォーレターワード(スラング)
に近い表現と似ている。
下手に使い回すとプロセスを壊す。
>>631 開発の現場でもよくあるけど、変な癖があって、
よくないのは分かってるけど、あとでまとめてきれいにしようって思っても
たいてい時間がなくなってそのまま出荷せざるをえないなんてことになりがち
基準がはっきりしてる場合は最初から守るクセをつけておいたほうがよい
この場合、コンパイル時に警告がでないこと、とか
マニュアルには明確に「使うな」と書いてあるくらいだし
>>636 getsで問題があるケースってどんなの?
getsはfgetsに置き換えるべきだが どうやれば簡単?
#define gets(buf, fp) fgets(buf, sizeof(buf), fp)
#define gets(buf) fgets(buf, sizeof(buf), stdin)
sizeof(buf) 危険すぎるだろ
645 :
デフォルトの名無しさん :2009/02/27(金) 01:01:15
例えば?
いやまて、開業の取り扱いがgetsとfgetsで違うぞ。
#define gets(buf) (fgets(buf, sizeof(buf), stdin) ? chomp(buf) : 0)
char *chomp(char *buf) { size_t len = strlen(buf); if (len && buf[len-1] == '\n'){ len--; buf[len] = 0; if (len && buf[len-1] == '\r') { len--; buf[len] = 0; } } return buf; }
( ゚д゚)・・・
マクロでtypeofみたいなものが使えない限り安全にはならないな
配列を渡したときだけしかうまく動かない gets なんていらない
普通に書き直せ
getsをそもそも使うな
_,.. -‐―‐-- .. __ /´ . `ヽ 、 / 、、: ヘ :::::::..... \ ./ ‐-_ヽ!:...__>;::;;;;;;;::::::::...._ \ / / \!´ \::::::::! ̄ ヽ、 ヽ, `‐rt-'....,,,___」 \::! .ソ_,ノ !:.\::::.. ヽ >、:.、../_,、!、 , --v‐- 、 _ ヽ::.ヽ::::.. `、 / ニ,:',.':::::::(´ , - ';;/::ノ.:::// l ̄`―`-:;;\::.. ヽ / /jヽ:::::::::::)-‐'チ、 //.:::;ィ'":;∠;_/.:::!::::::............. トr-;;_ `、 / ,.-=';`-- -‐ii' ミ!ユ、 ..:ヽ-'⌒/::;;-‐'´ └‐┴‐-----=;;:.ヽ;:::::..:;ノ::.::.ヽ;:::::::....... .. .oo!!_,,..-"-┘..... `┘ ´ ̄  ̄  ̄  ̄ ´
Fished!!!
>>651 でもどのみち素のgetsも安全じゃないし
オーバーフローしないだけマシかもよ
オーバーランだった
wikipediaで調べたらどっちでもいいみたいだよ
いや、そのりくつはおかしい
バッファオーバーフローって言わない?
再帰でオーバーフローするのとはニュアンスが違うから、オーバーランと言いたいなぁ。
再帰のがオーバーランぽいが
容器からあふれるのと停止位置を越える
664 :
476 :2009/02/27(金) 13:46:45
文字を10進数にするやり方はわかったんですが 10進数を文字にする変換をつくろうとしたんですが 読み込んで ABCの656667を読み込むと一つの数字などとよみこまれてしまい難しいです 65、66、67と認識するにはどうすればいいんですか? 2次元配列におさめるんでしょうか?難しすぎです おしえてください
>>664 ソースがないと何ともいえんが俺の勘によると
printf("%d",array[i]);の"%d"部分を"%d\n"にすればいいのでは
forで2桁読み込んだら次の要素を処理する様にする
sscanfでよくね
それより入力の書式があいまいだという事が理解できてないと思うな。 10進数で3桁になる文字(小文字の'd'以降とか)はどうするのか、とか。 プログラムはまず入力するものと出力するものを決める事から始める。 きちんと入力されるものが規定されてないと出力は決まらないんだよ。 例えばスペースで区切った文字コードを入力にすれば、 atoiとか使って意図する出力が得られるはず。 65 66 67 => A B C
669 :
デフォルトの名無しさん :2009/02/27(金) 14:46:08
Hello World! という文字列を表示させるプログラムって結構難しいですね。 #include <stdio.h> int main(void) { printf("%c%c%c%c%c%c%c%c%c%c%c%c??/n" ,0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f,0x72,0x6c,0x64,0x21); return 0; } 参考までに、皆さんはどんな風に書いているのか教えてください。
>>671 おぉー!
何かよく分からないけど、すごいですね!
他にも有りましたら、教えてください。
それにしても、printfかんすうを考えた人はすごいですね。
天才だと思いました。
2009ねん2がつ27にち
>>671 は最近良く張られるが、コンピュータプログラミングは
あーみえてかなり長丁場な世界で、一年二年でどーにか
なる世界じゃないみたいだな
671を見てなぜそう思うのかわからない。
結果は同じことだが、微妙なやり方の相違に異議と意味を見いだして いくこと。 結果最優先でやっていく世界とは多分違う
671ってジョークだろw
当たらずとも遠からずって感じ
679 :
デフォルトの名無しさん :2009/02/27(金) 16:35:42
> それにしても、printfかんすうを考えた人はすごいですね。 Ken Tompson?
>671 > % cc -o a.out ~/src/misc/hw/hw.c > % a.out ワロタw
681 :
デフォルトの名無しさん :2009/02/27(金) 16:56:02
> Chief Executive > > % letter > letter: Command not found. > % mail > To: ^X ^F ^C > % help mail > help: Command not found. > % damn! > !: Event unrecognized > % logout 俺はこれがオキニだな % が # だったりして・・・
どこが面白いのかわかりません 皆、すごいことをやっているように思えるのですが…
熟練した職業プログラマは無駄に長いコードを書くとか
許容範囲を見極めチャレンジで玉砕を軽く繰り返せる 勘と知恵と無鉄砲さを持ち合わせた人にしか共感できんネタだ。
Hello World!
>>617 数値ならまあ場合によってそれでいいけど、
文字列は enum じゃ無理だよね
#include<stdio.h> /*円の直径と円周の関係を表にする*/ main() { int d; float c; d=0; while(d<=100);{ c=3.14*d; printf("%d\t%f\n",d,c); d=d+10; } return 0; } と書いて、「デバック無しで開始」をやったら コマンドプロンプトに何も表示されません ビルドしてもエラーは0なんですが・・
;
一回は表示されるんじゃねその状況でも
while(d<=100);{ 釣りとわかっている魚の気分だ
ずっと待ってりゃなにかは表示されるんじゃないかなぁ。 ブルースクリーンとか。
ないない while の直後にセミコロンの単なる無限ループだもの
責任はとらんけどやってみりゃ分かるよ。 燃えやすいものはそばにおいとかんようにな。
ああ、そうか条件あっても満たす事ないのか普通に勘違いしてた
無限ループにも需要はあるよ。 計算機の利用率上げるとか。
702 :
691 :2009/02/27(金) 21:57:43
whileとforの後に;はダメなのか よく分かった、みんなサンクス
ちょwww;;
入門しようとしてる人に「文と式勉強しろ」ってちょっとオーバーじゃない? と一瞬思ったけどやっぱそうでもないのかな もう一つキーワードに複文を加えときたいけど
706 :
703 :2009/02/27(金) 22:53:15
>>705 そうかな。
もしそうだったらスマソ。
でも簡単にで良いから式、文、式文、複文などを勉強しておくと入門者でも結構見通しが良くなると思うんだよね。
ならうより なれろ 鉄則 そんで金あったら 一冊本買え
同じロジック書き直して分岐の数や関数が増減しなくなったら第一段階。
709 :
デフォルトの名無しさん :2009/02/27(金) 23:19:11
あのさー、今から本気でCを勉強するのってダメなの? なんか回り見るとみんなjavaとか一生懸命やってるし、 本屋に行ってもjavaばっかりなんだけど。 自分としては初めて勉強し始めたのがCだからCを極めたいというのがあって、 それとなんかコード書いててCだとなんかしっくりっくるっていうか、落ち着くって言うか、 まあ、Cしか満足に知らないからかもしれないんだけど。 ここはこういうことを聞くところではないのかな? 他で聞いた方がいい?
趣味ならお好きに 仕事なら使える言語は多ければ多いほどいい
一番求人が多いのがJavaだったっけ? どんな言語でも極めるというのは大変だ。 とくにこの世界はいろんなこと知ってないと。
一つの言語を極めるよりプログラムの仕方を覚えろ そうしたら後は何をしても大抵大丈夫
linuxでの開発がメインの俺はC、Java、perlあたりを仕事で使ってるけど、 そろそろM$の方にも手を出した方がいいのかと自問自答している。
Cは教養です
プログラムの仕方を教えてください
716 :
デフォルトの名無しさん :2009/02/27(金) 23:45:48
>>713 まずM$とか意味不明な表記を改めた方がいい
M$はマイクロソフトを軽蔑する言い方なのです。
Cは強要です
719 :
デフォルトの名無しさん :2009/02/27(金) 23:50:20
Cを学んでないプログラマはえせプログラマ
Cのフリーのおすすめの○○のコンパイラおすぃえて
極めるんならCよりはC++だな
極めるってなに? 入門書いくら買っても勉強にならない程度の知識を持つってこと? 詳細な文法もしくは言語の規格に詳しくなるってこと? それともコンパイラや規格などにおいて業界の第一人者になるってこと?
極めるって定義があいまいだが、周りの人が全員あいつはすごいって言ってくれたらそれなりに誇っていいんじゃね?
725 :
709 :2009/02/28(土) 00:04:35
あの、極めるって言っちゃったけど、そもそもそんなにレベル高くないし初心者だから あんまり突っ込まないで欲しいです。 ただこの前javaの本をちょっとだけ読んでみたら何書いてあるのか訳ワカランくてすこし焦った。このままでイイのかなって。
>>725 プログラミングが出来るようになってくれば
落ちついて順序良く見ていけば理解できる
>>725 学生ならCは勉強して置けよ。C++も。
RubyとかPHPとかも一個くらい勉強しておけ。
就職したらCOBOLだのABAPだのやらされるかもしれないけど、足しにはなるから。
728 :
709 :2009/02/28(土) 00:10:48
皆さんありがとう。 ところで今のところDOSの黒い画面でしかプログラムできてないんですけど、 winAPIって言うのはやはり覚えた方がいいのでしょうかね? 難しそうなんですけど。 これはC++でやればいいんでしょうか?
rubyは1.9になってわけわかんなくなった気がする。
perlが5で終わったように rubyは1.8で終わった
>>728 疲れた時の気晴らし程度でいい
余計疲れるかもしれないけどw
>>725 すまん別にいじめるつもりではなかった
C言語自体は別に極端に難しい言語でもなんでもないし
使わなくても詳しくなっといて欲しいぐらいには重要な言語
まあそんなに一気にたくさん勉強する自信ないんだろうから
まずなんのためにプログラム言語を勉強したいのか言ってくれないと
C言語とJavaどっちを薦めればいいのかわからないよ
趣味でゲームやWIndowsアプリ作りたいのか
SEなどで食っていけるようになりたいのか
明確な目的は無く単にPCやプログラムに詳しくなりたいのか
Googleみたいな所に入れるスキルが欲しいのか
etc..
Win32APIはまた独特だからなぁ Cの知識はもちろんだけど、API独特の流儀も学ばないといけないから大変だよ
どっちに行くかにもよるな。 web前世紀の今、javaやっといたらしばらくは食えるだろう。 ネットワークな人ならCは必須だろうし、科学技術な人ならいまだにfortran現役だし。 ただ、スクリプト言語は便利なので1〜2つくらいはやっといていいと思う。
デバイスドライバなどのHWよりのプログラム開発でもCは現役
737 :
デフォルトの名無しさん :2009/02/28(土) 00:22:27
>>734 ちなみに独特じゃないAPIってどんなの?
738 :
709 :2009/02/28(土) 00:23:08
>>731-732 どうも。参考にして見ます。でもAPIが解らないとプログラムって作れないんですよね?
俺の勘違い?
>>733 あのですね、何となくのイメージなんですよ、これが。初心者のですね。
Cって言うと、何となく地味にこつこつやるタイプのイメージ。
javaはOLとかが楽しそうにやってるイメージ(実際は全然違うんでしょうけど
なので自分はCをやろうかなと思った程度なんです。初めは。
>>738 そんな事はない
でも、windowsのソフトを作ろうと思うなら
知っていて損はない
Cでごりごり作るのはUnix/Linuxの話じゃない? WinはもはやWinAPI使うのがjkな感じに思えるんだが。
ずーっとC++をやってなかったのでここらでやってみるのも乙だなと思ったんだが、 Cで作らずにC++で作るメリットってなんですか?
C言語といったらUNIXや組込みのイメージだなあ んで Windowsで華やかなアプリ作りたいならC# 仕事の多いWeb系ならJavaやスクリプト言語 WIndowsプログラムは素人だけど いまどきわざわざWin32APIをC言語で使ってもあんま嬉しいことないような気がする
>いまどきわざわざWin32APIをC言語で使ってもあんま嬉しいことないような気がする 実際あることはあるよ。多くはないかもしれないが。 CでLinux用API作って、そのラッパーをWindowsで作ってWindowsAPIとして再利用。
>>743 まあ、あんま嬉しいことはないなあ。
他人からもこんな面倒くせえことよくやったなあ
この程度の評価。
>>724 そんな奴みたこと無い。設計者も含めてな
何か自作プログラムのソースうpすれば極めたかどうかは俺が認定してやるよ
javaなんてのは大抵茶髪のちゃらいやつがキーボード見ながらタイピングしてるイメージだからな
javaは学習に向いてるのに、お金も稼げる貴重な言語だ。 ちょっとcpuやメモリを無駄遣いしてる気分になるのが 玉に瑕だな。
フリーでおすすめのCコンパイラ教えてください。
gcc
GCC調べたらLLVMもいいそうなんですが
ってか、フリーならほぼUnix/Linux環境だな? でもってgcc以外を選ぶのはなぜだ?
すいませんXPです
755 :
デフォルトの名無しさん :2009/02/28(土) 01:17:40
visual C++ express
>>741 Cと同等の小回りを利かせながら、
Cを上回る抽象化能力を発揮できること。
winで初心者ならそのほうがいいな
あと勝手につっこませていただいて レベルはある程度関係なしに便利なエデイタは?
vi
タダだからLinux使うやつがいると本気で思ってそうなのが痛いな
762 :
デフォルトの名無しさん :2009/02/28(土) 01:31:34
>>761 フリーをタダだと思ってるならかなり痛いな
There is no such thing as a free lunch.
Not Found The requested URL /db/prong.htm was not found on this server. Apache/1.3.39 Server at www.ooyashima.net Port 80
progです。すいませんww 手打ちなもんで。 GCCはMinGWかCygwinのどちらが
linuxは代替がない場合に仕方なく使うものって感じだなあ 他に選択肢がある場合は基本的に使わないよ
俺は逆だな。基本linuxでしか仕事しない。 もちろんオフィスとかメールとかはwindowsだけど、開発はlinuxが95%だね。 あとはAIXとかsolarisとかかなぁ。
仕事の要請で仕方なく普段使わない環境使うのってストレスたまるよね。
いい経験だと思ってむしろ高揚する
化石環境はイライラするね
gccはオプションがカオスすぎて入門には厳しいのです
>>767 eclipse CDTとMinGWがいいと思う。初心者が必ず通る2分木の変数を、そのままデバッガで追えるから。
mingwはTDMってところで公開してる4.3.3が、iconvに対応しててshift jisが通るから、それを勧めとく。
gdb(デバッガ)は別途DLする必要があるかも。公式の3.4.5-3はshift jis(--input-charset=cp932)が
通らないので、よく例題にあるような日本語の文字列を、そのままソースに書き込めない。
>>769 あくまでここで議論する程度のコストでだけど、デバッグ周りならlinux/unixに優る物は無い。
残念な事に多くのメンテナも、まともに使って無いのが悲しいけどな。
VCEEが無料と言っても、linuxとはデバッグ機能に雲泥の差があるよ。
というか、仕事でプログラムを作るときは 環境の理解にエネルギーの70%をさくのでは?
ありがとうございます。 まさか開発環境構築に挫折未満中腰になるとは思いませんでしたww
変なのがいるが 窓で開発するってのにlinux/unixでgccとか無いから
開発環境は何でもいいから得意なの持っとくといいと思うぞ。 Javaの開発でeclipse使ってデバッグしたときの感動は今も忘れないが、 今はgdbのお手軽さに・・・
>>775 最近Linuxのプログラム書こうとしてたのでUNIXのデバッグ話すげえ聞きたい
gdb以外にどんなものあるんだろうか?
gprofやgcovは基本かな
他にはvalgrindやgoogle-perftoolsぐらいしかわかんないわ
>>782 バイナリハックを読めば参考になるものが発掘できるかもしれない
とりあえず%lf ところで ={0,} ってできたっけ?
getsでオーバーフローでもしてるんじゃねーの
40人も入力させるのは嫌がらせなのか… しかもハードコーディングされているしw とりあえずscanfのパラメータがおかしいな
%[^\n] これか 入力抑制してないじゃん
とりあえず-Wallオプション付けてgccでコンパイルしたら警告がたくさん出たのでそれをなくすことを考えよう。
stを初期化する場所がおかしいとか gets使うなとか printfに直で文字列ぶちこむなとか
こういうの見るとscanfは素人が使う関数じゃないってのがよくわかる
>>782 windows環境じゃelectric fence位しか動かないんだけど、
linuxのgccはコンパイル時に静的、動的領域のバッファオーバー(アンダー)ランを検出する
optionやライブラリが幾つかある。しかしlinux使ってると、簡単なリークやオーバーランが
すぐ見つかるんだよな。開発環境としては恵まれてても、機能を使わなきゃ、
何の意味も無いって事だ。もっとも、複雑なlibrary構成が原因で、追いきれないんだろうけど。
fgetsを使えと言われたのですがどうしたらいいのかよくわかりません 数字を入力するときや、文字列を入力したいときにはどうすればいいのでしょうか?
fgetsしてsscanfする
実際、本当の最初に最初だけscanfで、あとは全部fgetsで読ませて、 相当Cに慣れた頃に改めてscanfファミリーを教えるのが正しいと思うんだけどな
ぐくろうぜ。wikipediaにさえ書いてあるぞ
scanf,fprintfなどの書式付き入出力は書式定義文字列の 間のプラットフォームやバージョン互換性が低いからト ラブルの元になりがちなので凝ったのは使わないほうが いいと聞いたのですが、実際どんなものなのでしょうか?
799 :
785 :2009/02/28(土) 03:12:16
アドバイスありがとうございます。 scanfは使わないほうがいいみたいなので、 他の関数を使おうと思うのですが何を使ったらいいでしょうか?
マンコマンド使え
>>793 なるほどなあ
gccすげえ
man gcc してみたけどオプションたくさんあってどれのこと言ってるかさっぱりだ
Binary Hacksとか読みつつgccについてももう少し詳しくなってみようかなあ
【審議中】
|∧∧| (( ) ) (( ) ) ((⌒ )
__(;゚Д゚)___ (( ) ) (( ⌒ ) (( ) )
| ⊂l
>>800 l⊃| ノ火.,、 ノ人., 、 ノ人.,、
 ̄ ̄|.|. .|| ̄ ̄ γノ)::) γノ)::) γノ)::)
|.|=.=.|| ゝ人ノ ゝ火ノ ゝ人ノ
|∪∪| ||∧,,∧ ||∧,,∧ || ボォオ
| | ∧ (´・ω・) (・ω・`) ∧∧
| | ( ´・ω) U) ( つと ノ(ω・` )
~~~~~~~~ | U ( ´・) (・` ). .と ノ
u-u ( ) ( ノ u-u
`u-u'. `u-u'
>>798 もし君が正しい日本語を話しているつもりならもう1回教科書を読み直すこと
そうでないなら中学校からやりなおすこと
日本語構文解析能力が低い方がいらっしゃいますねw
凝った(書式)って事だろ。ぶっちゃけ798の自己完結通り。 書き慣れてる人は、無難で冗長な(その代わり読みやすい)、 コードを書く。つうかもう酔ったので寝る
807 :
785 :2009/02/28(土) 03:28:03
>>793 electric fenceってそんなもの使わなくても
VCなら、_CrtSetDbgFlag でメモリリークや簡単なオーバーラン
なら検出できるでしょ
単体テストレベルならたいていこれで十分だし、
VCの標準ライブラリとして存在するところは、むしろWindowsの
アドバンテージだと思う
さすがにコンパイル時にリークやオーバランの検出することまではできないけど
ランダムな大きさのメモリブロックの確保、解放を交互に繰り返してると メモリ容量は当然十分あるのにヒープがフラグメンテーションを起こして mallocコマンドがNULLを返してくることがあるからfree関数は頻繁に 呼び出すことは避け、ある程度まとめてあるタイミングで一気に呼び出した ほうが良い と聞きましたが正しいでしょうか? (フラグメンテーションの兆候としてmallocがやたらと時間がかかる ようになるとか聞きました)
freeを一気に呼び出すのはなるほど効果がありそうな気がしなくもないが、 フラグメントが問題になる・するようなら、 mallocの回数を減らすほうがよっぽど世間でよく行われる対策だと思う。
812 :
デフォルトの名無しさん :2009/02/28(土) 10:59:00
> ある程度まとめてあるタイミングで一気に呼び出した > ほうが良い これが結局 exit ぐせになる
813 :
デフォルトの名無しさん :2009/02/28(土) 11:22:14
exit でいいじゃん。
>>809 まとめて、というより、要らなくなったらすぐに free すればいい
わざわざfreeを遅延させても意味はない
フラグメント対策なら、malloc/free をいじるより、確保するサイズを
揃える(例えば2のn乗)方がいい
確保するサイズを2のn乗にすると管理領域込みで2のn乗+αの領域が必要になるよね。
>>815 そういう細かいことはどうでもよくて、確保するサイズを揃える方が
効果あるってこと
alloca
>>817 揃えると何故フラグメント対策になるんだ?
全く理解不能。
サイズを揃えることとフラグメントは全く関係ない。
malloc/freeの機能や性能が問題になる規模のアプリなら
>>811 でFAだ。
そんなことは入門の間はあんまし気にしなくていい。
中級くらいでも気にしなくていいケースの方が多い。
C言語の初心者、入門者、中級者、上級者、専門家とか 言われてますが、具体的にどう区別したらいいでしょうかね?
名のったもの勝ち
823 :
デフォルトの名無しさん :2009/02/28(土) 14:33:35
>>811 普通の malloc は未規定の実装だ
特定の malloc に依存した最適化をやるなら環境を判別すべき
>>819 サイズが揃えるというよりもallocする最小単位を例えば64K単位に切り上げると規約してコーディングするとmalloc管理ポインタの数が減ってmallocの処理速度は早くなる傾向はあるだろうね。
フラグメンテーションが問題になるのはmarkやreleaseなどの
あるポインタより上位アドレスにあるヒープブロックの一層
プロシージャが用意されてるPASCAL系言語の話でCは実は余り
関係が無い(と思うよ)。
ただ最近のmallocは処理速度をかなり重視しているので、
空き領域検索の最適検索を適当にしてfirst-matchストラテジーに
近づいてる傾向があるので。フラグメンテーションが発生すると
NULLを返す確率が増えると聞く。
その意味でもなるべく小さなブロックを作らないように心がける
というのは良いことだろうと思う
ライブラリの実装自体も進化しつづけているから半端な最適化の 独自実装やるくらいなら何も考えずそのまま使った方が安定してたりすんじゃないか なので全体でなく、具体的なボトルネックを見つけ出して、ピンポイントに地道な 改善(リスト=>配列とか)を積み重ねていくことを考えたほうがいいと思う
826 :
デフォルトの名無しさん :2009/02/28(土) 14:44:21
COBOL経験5年の者ですが、 C言語&java&phpを覚えるには1月では不可能でしょうか。
人による 求められているレベルにも依存する が、個人的には無理なんじゃないかという気はする
>>826 可能。
1言語1週間で残りの1週間でschemeを覚えるべき。
829 :
デフォルトの名無しさん :2009/02/28(土) 14:52:18
1週間で1言語なんて、文法のさわりを覚えても使い物にならないレベルにしかならない。 本当は1年で1言語くらいがちょうどいいん。
>>828 みたいのがいるからアホプログラムが乱立してえらいことになるんだな
せいぜいやさしいCでも読んでわかった気でいろよw
834 :
デフォルトの名無しさん :2009/02/28(土) 15:08:31
やさしいシリーズなら1週間で数冊読めるんじゃね? ただそれだけのレベルにしかならないが。
やさしいCはいい本だよ。これで十分。
やさしいCを終えたやつがここで質問に答えてるのかwww
「お姉さんとやさしくC」 は難しいだろうな
CなんてそもそもやさしいC以上でも以下でもないよ。
俺C言語初めて1週間だけど専門家だよ
俺はaからzまでの言語をマスターしている
やさしいZ言語期待
>>830 んなアホな。普通の手続き型言語なら、文法とライブラリの編成を憶えりゃ(1〜2週間くらい)、あとはマニュアル引き引きである程度何とかなる。
(特殊な概念があるものについてはものによるが)
まぁ、1言語を1年かけて深くやるのは悪くないやり方だ。
「達人プログラマー」(黒い方)にも1年に1つ言語を学ぶべしって書いてある。
言語覚えるだけなら1週間程度でもいけるだろ ライブラリは別だが
>んなアホな。普通の手続き型言語なら、文法とライブラリの編成を憶えりゃ(1〜2週間くらい)、あとはマニュアル引き引きである程度何とかなる。 でもうちには来てほしくない。
おまえら使い物になるかどうかで判断しれw
言語覚えるのとちゃんとしたプログラムが組めるのは雲泥の差がある
小説読んで小説家になったつもりにでもなってろ
1週間で習得できるものを、1週間も続けられずに習得できてない奴が、ゴチャゴチャ言っても意味が無い。 先ずは1週間続けてみろ。話はそれからだ。
>>849 おまえあれだろ 1週間かけてさわりの部分はわかったといって、インターネット上検索しまくり該当処理をコピー&ペーストして
仕上げていくきだろ
自分のペースでやれよ。 なに、1週間にこだわってんの?
一週間で覚えたつもりになって職場で絶望するでFA
別に絶望はしないだろ 1週間だからと自分に言い訳する程度だ
覚えるんじゃなくて理解するんだけどな。
文法を覚えても小説は書けないよってだけ
言い訳するくらいなら最初から覚えたとか考えるな。 1年かけて謙虚に勉強しろ。
3年かけてようやくポインターを理解したセンスのない奴らの僻みって凄いなww Cなんてちょっとセンスがあれば1週間で覚えられる言語だよ そんな大変な言語じゃない 逆に言えば、そのシンプルさがCの良さだ
俺なんて3日で極めたぜ
Cは言語だけ覚えてもダメってことに気付けw
それはアプリを作るのであればCに限らず全ての言語に言えること。
現実としてまともに使いこなせるようになるまで1週間というのはあまりにも世界を知らなすぎる。
>>857 本当に覚えてればいいが
覚えた気になってるだけの人はたちが悪いw
世界には馬鹿が多いからな。
まあ口ではあることないこと好きに言えるからな。 匿名掲示板で何言ったってアホ?の一言で終了できる。
3日とか1週間とか3年とか言ってるお前らの方がよっぽど馬鹿だけどなww
井の中の蛙レベル
どんぐりの背比べ
大海にはCを1週間で覚えてバリバリ仕事してる連中がたくさんいる カエルには解らないだろうけどな
一週間で覚えたって思ってるやつはまさにそうだな
1週間で覚えたやつがバリバリ仕事して大変な無数のバグを顧客に指摘されるというケースがあるのをご存じだろうか?
>>869 一週間バリバリ勉強して、3年ちんたら勉強した後に、バリバリ仕事してんだろww
お前らのレベルの低い職場自慢はそこまでだ
むしろレベルの高い職場をいってみれ
他の言語やってれば1週間でも覚えられるだろ
だから覚えるのと使えるのは(ry
覚えたけど使えないとか抜かす無能がまだいるのか
中学生でもCは二週間ぐらいで覚えられる。 それが使えるかどうかだなまさに
879 :
デフォルトの名無しさん :2009/02/28(土) 16:42:43
覚えたら使えると思ってる奴って本当にいるのか疑わしくなってきた もはや意地になって書き込んでるとしか思えん
センスがあれば1週間でCを使える。 センスが無ければ3年あってもCを使えない。 それだけ。
たぶん一人だろ
1週間でCを使えるようにならない奴は自分のセンスの無さを呪え。
>>880 は問題外だが、ある程度の経験があれば応用が利くようにはなる。
でもそれなりの使い手になるには相応の時間が必要だ。
885 :
デフォルトの名無しさん :2009/02/28(土) 16:50:42
使い手である必要はないんじゃね?
>>880 が目指してるのはあくまでやさしいCレベルだし。
技術が無いニンゲンはやさしいCがどうのこうのと言わなければ自分の自尊心を保てないんだろうな。
一週間である程度使えるようになってそこから精進していくならわかるが 一週間で完璧に出来る奴がいたら見てみたいw
Cなんて「やさしいC」をマスターしていれば十分だ。
>>887 随分レベルの低いコミュニティーに属しているんだな
890 :
デフォルトの名無しさん :2009/02/28(土) 17:01:09
C言語はHTMLとリンクしますか? 例えばweb上で保険の加入システムのようなシステムを作るには、 何が必要でしょうか。 HTMLとCとoracleがあれば無償で作成可でしょうか。 oracleではなくSQLでしょうか。 トンチンカンですみません。
レベルの高いコミュニティーにいる人間だって1週間でマスターするなんて不可能だ。
日本語マスターしてると言ってもろくに文章も書けない 売り物になるには程遠い
>>891 まさに、井の中の蛙的発言だな。君は大海を知った方がいいよ。
>>891 レベルの高いコミュニティーに属してから言えよww
897 :
デフォルトの名無しさん :2009/02/28(土) 17:08:01
お前らにとっての大海は俺の家の便所の水くらいのもんだろ せいぜい匿名掲示板で天才ぶれよw
じゃあ俺は一秒でC使えるようになるわ
じゃあ俺は0.1秒で。なんせ大海に住むレベルの高いコミュニティーの一員なので。
まあ、自分が3年かけて使えるようになったものを、 実はセンスがあれば1週間で使えるようになるなんて信じたくないよな。 自分がセンスが無いと認めてしまうことになるからな。 自尊心がそれを許さないんだろう。
センス云々の話ではもうない気がする。 1週間っていうのを押し通したいか屈するかの問題だろ。 消防の話だと思ってスルーしてくれ。
NG「センス」「自尊心」
消防レスが続いたのでまとめておくと、 大海:腐った水たまり 蛙:大会に住むボウフラ 覚えた:やさしいCを読破した センス:うんこ波の自尊心 それでは続きをお楽しみ下さい。
やっと24のシーズン2見終わったぜw で、何このスレの速さ?
>>906 オメ!
24はだらだら長く続くからちょっと飽きるけど、でも見ちゃうな。
908 :
デフォルトの名無しさん :2009/02/28(土) 18:04:45
ありがとうございます。 CGIはPHPで実現が可能なのですよね。 本屋で色んな本を立ち読みしましたが、 業務webアプリケーションを構築するにはHTMLとPHPまたはJAVAとSQLがあればよいみたいに書いてました。 PHPとJAVAはwebアプリケーションを作るにあたってはちがいがないと考えてよいでしょうか。
そもそもだ、 大海を知るあなたたちがどういう海でCを一週間で使えるようにしなければいけないのか。 他の言語は関係なさそうだよね、流れとしては。
で皆Cは好き?
Cで何でもできるけど、もうちょっと刺激的な言語の方が面白いね。
刺激的な言語?
Cって誰でも出来る?
914 :
デフォルトの名無しさん :2009/02/28(土) 18:50:19
できるよ。
できねーよ。
Z80
8080
':, ', _____,,.. -‐ ''"´ ̄ ̄`"'' ー 、., / ':, ', >' ´ `ヽ. / し バ ':, / ヽ. ,' な カ ':, ,:' / / ,'´ ヽ. ':,/Ti i. い に . \ ,' / / ,' ! ; ', ヽ__ /::::| | | で \ / ,' ,'! /! ! ; /! i 「:::|'´::::::::| | .!. く ∠__,! / !メ、」_,,./| /! / ! ハ! |__」<:::::」」 |. れ `"'' 、..,,_ ! / ,ァ7´, `iヽ| / |ヽ、」ニイ、 | ! |^ヽ、」」 |. る i,/レイ i┘ i. レ' 'ア´!_」 ハヽ| | | ∠ ! ? ─-- / ! ゝ- ' ! ! ! | | `ヽ. / 7/l/l/ 、 `'ー‐ '_ノ! | i | ` ' ー--- ,. -──-'、 ,人 `i`ァー-- 、 /l/l/l | !. | | ヽ.ソ `: 、. レ' ', u ,/| | ! | そ で i /ーナ= 、 '、 ノ ,.イ,カ ! | | の き .|ヘ./|/レへ`>-r =ニi´、.,_ | i ハ ! ,' く る ! _,.イ´ヽ.7 / /:::| /レ' レ'レ' ら わ | /7:::::! ○O'´ /::::::レ'ヽ. い .よ .| / /:::::::レ'/ムヽ. /::::::::/ ヽ. ! ! ! ./ ,':::::::::::!/ ハ:::::`´:::::::::::;' ',
何年もこのスレや宿題スレに粘着してるのに、ちっとも成長しないお馬鹿さんには、 一週間でCができるようになる人の存在は認められませんw
スルー検定実施中
このスレに粘着してて成長期待できるわけねぇだろwアホか
右算術シフトしたいときは除算したほうが安全なのでしょうか?
意味わからん
>>920 まさか1モジュール作って単体テストで終わりではないよな それでは全く素人と同じだもんな
他言語で普通にできる人なら、一週間程度でそれなりにこなせるようになるだろ。
お前はいつまで引きずってんだw
できねーよ。うちのばあちゃんにCやらせたってできねーもん。
>>926 マニュアルまたはサンプル(雛形)を参照しながらなら暇な大学生だったらできるだろう しかし実際は複数モジュールで1つの目的を果たすのだから
当然、結合テストまでのデバックやその環境(ダミーモジュールやツールを作ったりいろいろ)、上位行程までの試験環境の構築、業務を把握しな
ければならない本番データや異常処理まで含めなければプロとしては精通しているとはいえないだろ
それに、言語が違えば使えるツールや使用できるDBやらもろもろ変わってくる場合がある マニュアルやドキュメントだってないかもしれない
そんな状況で1週間で把握したものがどれ程のものになる いくら他の言語をしっていても加速するまではそれ相応の時間がかかる
>>923 何が「安全」なのか知らないが、シフトより2のn乗で割るのが簡単だろうね。
933 :
デフォルトの名無しさん :2009/02/28(土) 21:41:18
すみません・・・ CGIはPHPで実現が可能なのですよね。 本屋で色んな本を立ち読みしましたが、 業務webアプリケーションを構築するにはHTMLとPHPまたはJAVAとSQLがあればよいみたいに書いてました。 PHPとJAVAはwebアプリケーションを作るにあたってはちがいがないと考えてよいでしょうか・・・ (T_T)。
やれることは同じだよ。
>>929 変な改行する奴が何言っても説得力がないw
>>929 それって職場になじむまでの話だろ。
言語の習得と全く関係のない話だ。
>マニュアルやドキュメントだってないかもしれない 勝手に意味わかんない条件つけんなw
>>929 はDBやモジュールの意味がわかってるんだろうか
わかってないから
>>929 みたいな書き込みするんだろ?
>>940 お前は環境が変わるということをわかっているのか
何で環境の話になってるの?バカなの?
>>943 おまえは他の言語を習得して使えもんになるのかといったな
>
>>943 おまえは言語変わっても環境はそのままだと思うのか
俺の会社で俺ライブラリーを使った開発を頼んだら、
どんなエキスパートだって俺ライブラリーに慣れるには時間がかかるだろ。
言語の習得と、特定の環境への適応は全く別の話だ。
特定の環境への適応を言い出したら、世の中にプログラミング言語を取得している奴なんていなくなる。
>>929 はまったくバカな議論だ。
>使えもん
それならアルバイトの大学生で十分ではないのか
使えない人間にいくら私は言語を習得したから雇えといわれて雇えるか
それならスキル表の提出なんかいらないだろ
スルー検定はおばあちゃんで対抗した俺以外不合格だな
>>952 >>929 の理論では、雇い先ごとに開発環境が違って、初期状態では誰もスキルなんて持ってないから
誰を雇っても同じだ。
わーこんなにスレが荒れてどうしたのみんな PGとしては一流でもスルースキルは三流ですか
このスレはいつもこんなもんだからw
明治生まれのコンピュータ
お前らうるせえ。 全員アンカつけてやれ。
>>955 あほか、だから言語という共通のスキルだけでもあわせようとする
>>946 おまえは言語がかわるとはどういうことかわかっているのかOSも変わる可能性だってある
OSかわった程度で困るPGとかいんのかよw
>>962 こまらないならスキルに使用言語を削除するか
日本語でおk
言語が同じなら開発環境も似てくる スキルを積めば異なる環境への対応度も柔軟になる
OSが変わったらめっちゃこまるんだが… XP->Vistaでもプログラムかなり変えたしなぁ
それ意味違うだろw
>>931 右シフトは論理なのか算術なのかは未定義だったような
ああ、UINT DWORD とかはムカつくな。
>>960 だから、その「言語という共通のスキル」は1週間で身につけられる。
>>970 1週間で身につけたものはスキルとは言わない
>>971 ならば「言語という共通のスキル」は
>>971 定義の「スキル」ではないというだけのこと。
だから何?
面接官:「C言語は扱えますか?」 自分:「はい、大丈夫です」 面接官:「ご経験はどのくらいで?」 自分:「1週間です」 面接官:「( ゚д゚)・・・」
>>972 おまえは1週間でどれだけのことができる どれだけの成果物を残せた結果のスキルなんだ
>>973 当然そのあと技術面接するんだろ?マスターしていれば1週間で10年でも変わりない。
客観的に言語の腕を言い表すのは難しい・・・ 製作者に俺の名前が入ってるフリーのソースが20ほどネットでゲットできますよ、とかいえば そのソース次第ではいい印象かも。
>>975 1週間なら簡易HTTPサーバーくらいじゃないか?
>>977 言語のスキルなんて適当に問題出してその場で答えさせればすぐ分かるよ。
>>980 実際そこまでするか?って感じ。
履歴書に開発経験を数行書いておけばいい希ガス
実際に試さないとはったりだけで全く使えないのが入ってきちゃうからw
>>981 その程度の会社なら、その程度の採用判断でいいんじゃないの?
うちの会社じゃあり得ないけど。
そのための試用期間ですよ
実際に問題を解かせるなんて、中途採用じゃないな? ここでは中途の話をしてるのかと思ったが・・・ 逆に新卒で面接のみってのはほとんどないだろう。
履歴書に開発経験なんて当てにならんよな。 この前クビにした使えない派遣が次の就活でどんな素敵な開発経験を書いていることやら。
外資系ならそいつの履歴を確認して即採用って多いぞ。 その代り使えないと判断されたときの切り方も神速だが。
まあ、外資と日本企業では採用も首切りもやり方が違うからな。
このスレに書き込んでるやつは試験が絶対に必要だな。
マ板に消えろクズども
いや、俺だろ。
ざけんな俺が
いやいや俺が
それでは私が
埋め
どうぞどうぞ
埋め
埋め
1000キター
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。