C言語なら俺に聞け! Part 101
■ このスレッドは過去ログ倉庫に格納されています
0001v(^o^i)d
05/01/31 08:37:54質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
各種リンク、関連スレは>>2-13あたり
C言語なら俺に聞け! Part 100
http://pc5.2ch.net/test/read.cgi/tech/1106403600/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0232デフォルトの名無しさん
05/02/03 16:07:12どんどん伝染を繰り返し、馬鹿が増える。
馬鹿が増えると文明を維持することが困難になる。
文明を維持することが困難になると人類の繁栄に影響がでる。
人類の繁栄は最優先事項なので、馬鹿が伝染すると困る。
0233デフォルトの名無しさん
05/02/03 17:28:19void pp(char *fmt, ...) {
printf(fmt);
}
とか。
0234デフォルトの名無しさん
05/02/03 17:36:45printfの場合はvprintfを使え。
自作の関数の場合は初めからprintf/vprintfの用にva_list版も作って置け。
0236デフォルトの名無しさん
05/02/03 22:15:39名前なんかいちいち見ないよ
0237デフォルトの名無しさん
05/02/03 22:21:23ドアの1つには賞品の車があります。残りの2つのドアはハズレでヤギがいます。
あなたがドアの1つ、たとえば1番ドアを選びます。
司会者は、それらのドアに何があるかを知っており、ヤギのドアを1つ、例えば3番ドアを開けてみせます。
そこで司会者があなたに、「2番ドアに変更してもいいですよ」といいました。
2番ドアに変えたほうがいいのでしょうか。
↑の確率を試行回数1万回くらいで実験してみたいんですが
どんな風に書けばいいの?
0238デフォルトの名無しさん
05/02/03 22:47:28ごく単純なマルコフ過程。
0239デフォルトの名無しさん
05/02/03 22:48:36変えた時は1/2で変えない時は1/3。以上
0240デフォルトの名無しさん
05/02/03 22:50:42はい?もう一度良く考えて。
0241デフォルトの名無しさん
05/02/03 22:55:27え”!!違うの?ずっとそうだと思ってた
0242デフォルトの名無しさん
05/02/03 22:56:20王子が結婚するというので王様が一人だけ恩赦にしてやることになった。
誰が恩赦になるのか決定されたが、まだ囚人たちには知らされていない。
結果を知っている看守に、囚人Aが『BとCのうち、どちらかは必ず処刑
されるのだから、処刑される一人の名前を教えてくれても、私に情報を
与えることにはならないだろう。一人を教えてくれないか。』と頼んだ。
看守は、その言い分に納得して『囚人Bは処刑されるよ』と教えてやった。
囚人Aは、「はじめ自分の助かる確率は1/3だった。いまや助かるのは
自分とCだけになったので、助かる確率は1/2になった」と喜んだ。
さて、看守の返事を聞いた後の囚人の助かる確率はどれだけか?
0243デフォルトの名無しさん
05/02/03 22:58:15Cの話にアレンジできない低脳は氏んで
0244デフォルトの名無しさん
05/02/03 22:59:20文字列とポインタに関してです。
ポインタの文字列というものを勉強しているとき、
char *ptr = "123";
ptr = "456";
と途中で書き換えられる。
と書いてありました。
しかしもう少しよんでいくと、ポインタの文字列リテラルの中身を書き換えてはいけない
と書いてありました。
いったいどういうことでしょうか?
ポインタで文字列を扱った場合、書き換えてはいけないのですか?
0245デフォルトの名無しさん
05/02/03 23:00:27237と問題違うし
0246デフォルトの名無しさん
05/02/03 23:00:300247デフォルトの名無しさん
05/02/03 23:00:56アレンジできてないのはお前一人
0248デフォルトの名無しさん
05/02/03 23:01:18どう言う確立で司会者が変更して良いというのか。
0249デフォルトの名無しさん
05/02/03 23:01:34どこに書いてた?
0250デフォルトの名無しさん
05/02/03 23:02:42明解C言語という本です。
0251デフォルトの名無しさん
05/02/03 23:02:481/3
0252デフォルトの名無しさん
05/02/03 23:02:510253デフォルトの名無しさん
05/02/03 23:03:01司会者がどこが当たりか知っているのか?
それによっては条件が変わってくるぞ
0254デフォルトの名無しさん
05/02/03 23:05:14ソレはptrは書き換わってるが、"123"を書き換えてるわけじゃなく。
0255デフォルトの名無しさん
05/02/03 23:05:28書いてあるだろよ
0256デフォルトの名無しさん
05/02/03 23:05:34で、ハズレを教えてもらって残り2択となり、
選んだものがハズレの場合、変えた時点で
当たるわけだから、変えたときは2/3かな?
違う?
何言ってるかわからなくなった。
orz
0257244
05/02/03 23:07:00456という文字列の先頭ポインタをさしているんですよね?
それは456という文字が連続してあるからでしょうか?
これが457だとエラーになるのでしょうか?
それならなっとくが出来ます。
0258デフォルトの名無しさん
05/02/03 23:08:02氏ねばいいのに
0259デフォルトの名無しさん
05/02/03 23:08:48変えるか変えないかの二択の時1/3、
再分配すると1/2じゃないかね
0260デフォルトの名無しさん
05/02/03 23:09:41御前が市ね。スレの雰囲気を崩すな。
低脳は困る。
0261デフォルトの名無しさん
05/02/03 23:10:25char *ptr = "123";
ptr = "456"; /* できる */
strcpy(ptr, "456"); /* できない */
ということじゃないの。
0262デフォルトの名無しさん
05/02/03 23:11:28コード書けねえバカクズばっかり!!!!!!!!!!!
0263デフォルトの名無しさん
05/02/03 23:11:55ptr = "456"; /* できる */
*ptr = '4'; /* できない */
0264デフォルトの名無しさん
05/02/03 23:13:180265244
05/02/03 23:15:55よくわかりました。ありがとうございました。
0266デフォルトの名無しさん
05/02/03 23:17:200267デフォルトの名無しさん
05/02/03 23:31:55そんなんで分かっちゃだめだよん
0268デフォルトの名無しさん
05/02/03 23:34:34はじめにハズレを選んでいた場合、変えたら必ず当たる。
はじめにあたりを選んでいた場合、変えたら必ず外れる。
で、はじめにハズレを選ぶ確率は2/3なので、
変えた場合、必然的に2/3で当たることになる。
実験するまでもなくね?
0269デフォルトの名無しさん
05/02/03 23:40:51"January" や "February" のように " " で囲んだ文字列を
「文字列リテラル」又は「文字列定数」と呼びます。
文字列リテラルは「定数」であり、本質的に値を変えないものです。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
しかし、値を変えないはずの文字列リテラルですが、この単元で説明したように
ポインタを用いて指定をした場合、その変更が可能になってしまいます。
そのため、ANSI規格では文字列リテラルを「定数」とは呼びません。
たとえば、
char *p = "ABC";
strcpy(p, "DEF");
とした場合、処理系によっては文字列の書き換えが可能になります。
(処理系によっては動作不能になります。)
文字列リテラル内の文字列を変更してよいかどうかは、処理系に依存しますが、
ANSI規格では、文字列リテラルの変更は未定義(何が起こるかわからないということ)です。
http://www9.plala.or.jp/sgwr-t/c/sec10-3.html
0270デフォルトの名無しさん
05/02/03 23:49:42char *ptr = "123";
ptr = "456";
おそらくこれで、文字列が書き換わっていると勘違いしていると思われる。
char *org_ptr = "123";
char ptr = org_ptr;
ptr = "456";
printf("%p, %p\n", org_ptr, ptr);
これを試してみれ。文字列が書き換わっているんじゃなくてアドレスが
書き換わっているだけだ。
0271デフォルトの名無しさん
05/02/03 23:56:47char *point;
point=( char *)malloc( sizeof(char) * (strlen(str)+1) );
strcpy(point,str);
0272デフォルトの名無しさん
05/02/03 23:58:420273デフォルトの名無しさん
05/02/04 00:00:100274デフォルトの名無しさん
05/02/04 00:00:38結局大丈夫なんですか?
0275デフォルトの名無しさん
05/02/04 00:03:20そんなレベルの問題じゃない
0276デフォルトの名無しさん
05/02/04 00:04:12>>273
日本語も理解できない池沼ですか?
0277デフォルトの名無しさん
05/02/04 00:05:130278デフォルトの名無しさん
05/02/04 00:05:58まぁ大体そんな感じだな。
0279デフォルトの名無しさん
05/02/04 00:07:07ま、実際に規格を作る段階で>>274のような実装の処理系があるから
ということで検討がなされたんだけどね。
規格となってしまった現在ではそういうレベルの問題じゃないというのは同意。
0280デフォルトの名無しさん
05/02/04 00:11:19どうやら画像サイズに関係しているみたいです。(1024*768 160*120ならOK,800*600 1024*819ならNG)
memcpyでエラーが発生してるってことはデバッガで確認しましたが、理由がわかりません。
あくまで推測ですが、ポインタが怪しいかと。
環境
OS Windows
VC.NET
ソース一部。
前略
typedef struct{
unsigned char b;
unsigned char g;
unsigned char r;
}pixel;
中略
void henkan_mirrou(BITMAPINFOHEADER *bminfo, pixel *img){
int x,y;
pixel cache;
for(x=0;x < bminfo->biWidth;x++){
for(y=0;y < (bminfo->biHeight/2);y++){
memcpy( &cache, (img + (y*bminfo->biWidth) +x) , sizeof(pixel) );//←←←エラー(?)
memcpy( (img + (y*bminfo->biWidth) +x) , (img + (bminfo->biHeight-y) * bminfo->biWidth +x) , sizeof(pixel) );
memcpy( (img + (bminfo->biHeight-y) * bminfo->biWidth +x) , &cache, sizeof(pixel) );
}
}
}
以上。
ご教授下さい。
0281デフォルトの名無しさん
05/02/04 00:11:24アフォ?
0282デフォルトの名無しさん
05/02/04 00:14:17エラー出してるんなら原因わかるでしょ。
0283デフォルトの名無しさん
05/02/04 00:16:18レベルが違うとはどうゆう違いなのでしょうか?
244さんが言う「ポインタの文字列リテラルの中身を書き換えてはいけない」
とは
char *p = "\n";
*p = '\a';
printf("\n");
がおかしくなる処理系の場合を指しているんじゃないんですか?
0284デフォルトの名無しさん
05/02/04 00:18:480285デフォルトの名無しさん
05/02/04 00:21:050286280
05/02/04 00:21:53解決方法がわからないから困ってるんです。
追加
・別関数の左右反転は正常にできる。
・画像サイズが大きいと発生というわけでも、小さいから発生と言うわけでもないみたいです。
0287デフォルトの名無しさん
05/02/04 00:24:23(1) y=0 の時に bminfo->biHeight-y はどこを指す?
(2) 4バイト境界の罠
0288デフォルトの名無しさん
05/02/04 00:25:16エラーとは何?
memcpyの前後で書かれるべき値が書かれてないってこと?
0290デフォルトの名無しさん
05/02/04 00:41:12int a;
struct {
int b1;
int b2;
} b;
};
という構造で a と b1 は同じ領域を占めることって保証されてますか?
0291デフォルトの名無しさん
05/02/04 00:42:20保証されません。
0292デフォルトの名無しさん
05/02/04 00:50:21struct {
int a1;
int a2
} a;
struct {
int b1;
int b2
} b;
};
でもこの場合a1とb1が同じ位置になることは保証されますよね
どうして結果が違うんでしょう??
0293デフォルトの名無しさん
05/02/04 01:05:450294デフォルトの名無しさん
05/02/04 09:22:150295デフォルトの名無しさん
05/02/04 09:23:130296デフォルトの名無しさん
05/02/04 09:23:340297デフォルトの名無しさん
05/02/04 10:06:01----------------
#include <stdio.h>
int main(void)
{
int c;
FILE *fp = fopen("source.c", "rb");
while((c = fgetc(fp)) != EOF){
fputc(c, stdout);
}
fclose(fp);
return 0;
}
----------------
0298デフォルトの名無しさん
05/02/04 10:33:290299デフォルトの名無しさん
05/02/04 10:35:200300デフォルトの名無しさん
05/02/04 10:41:50それがどう関係する?
0301デフォルトの名無しさん
05/02/04 10:42:531って何型?って聞かれたんですが・・・。
何型なんでしょう?
0302デフォルトの名無しさん
05/02/04 10:48:59while 云々関係なく「1」はint型
0303デフォルトの名無しさん
05/02/04 10:49:050304デフォルトの名無しさん
05/02/04 10:53:51LINUX版の「_pgmptr」とかないっすか?
0305デフォルトの名無しさん
05/02/04 11:00:110306デフォルトの名無しさん
05/02/04 11:07:44標準的な方法はない
0307デフォルトの名無しさん
05/02/04 11:10:00argv[0]
0308デフォルトの名無しさん
05/02/04 11:15:470309デフォルトの名無しさん
05/02/04 12:53:43それはOSに依存してるよ〜
UNIX系環境ではコマンドラインの一番目が来ちゃう
0310デフォルトの名無しさん
05/02/04 13:05:37UNIX系環境では知らん
0311デフォルトの名無しさん
05/02/04 13:41:57さっぱりわかりません
分けわっかんなああああああああああああああい
0312デフォルトの名無しさん
05/02/04 13:47:11あなたはプログラミングに向いていません。
0313デフォルトの名無しさん
05/02/04 13:50:50プログラミング関係ないよ。
0314デフォルトの名無しさん
05/02/04 13:51:04それを言うなぁ!!
日曜プログラマなのでちょこっとづつ理解していくさT〜T
0315デフォルトの名無しさん
05/02/04 13:52:46にゃんにゃん
0316デフォルトの名無しさん
05/02/04 13:54:15大原ゆきに教えてもらえ。
0317デフォルトの名無しさん
05/02/04 13:56:21にゃふうん
>>316
だれだよソレT〜T
0318デフォルトの名無しさん
05/02/04 13:58:26>>207
0319デフォルトの名無しさん
05/02/04 14:05:23構造体…一緒に使うデータなんかは纏めておいたほうが楽だよね?
オブジェクト指向…構造体についでにそれの処理法も纏めておくと
中でなにやってるか気にせずに済んで楽♪
ポインタ…これはC言語及びC++言語のある意味最大の特徴
俺は理論だけじゃ完全に理解できなかったので
デバッガ使って何やってるか追い駆けた
0320デフォルトの名無しさん
05/02/04 14:05:29クラスがどーとかうすーい記憶が。
ポインタなんて一生わかんね!
わかんなくてもAPI使えるからいいもん!
>>318
にゃん抜きな人なのね
ありがと。
0321デフォルトの名無しさん
05/02/04 14:09:56,,、,、、,,,';i;'i,}、,、
ヾ、'i,';||i !} 'i, ゙〃
゙、';|i,! 'i i"i, 、__人_从_人__/し、_人_入
`、||i |i i l|, 、_)
',||i }i | ;,〃,, _) 汚物は消毒だ〜っ!!
.}.|||| | ! l-'~、ミ `)
,<.}||| il/,‐'liヾ;;ミ '´⌒V^'^Y⌒V^V⌒W^Y⌒
.{/゙'、}|||// .i| };;;ミ
Y,;- ー、 .i|,];;彡
iil|||||liill||||||||li!=H;;;ミミ
{ く;ァソ '';;,;'' ゙};;彡ミ
゙i [`'''~ヾ. ''~ ||^!,彡ミ _,,__
゙i }~~ } ';;:;li, ゙iミミミ=三=-;;;;;;;;;''
,,,,-‐‐''''''} ̄~フハ,“二゙´ ,;/;;'_,;,7''~~,-''::;;;;;;;;;;;;;'',,=''
;;;;;;;;''''/_ / | | `ー-‐'´_,,,-',,r'~`ヽ';;:;;;;;;;, '';;;-'''
''''' ,r'~ `V ヽニニニ二、-'{ 十 )__;;;;/
0322デフォルトの名無しさん
05/02/04 14:10:41オブジェクト指向の説明間違っているぞ。
0323デフォルトの名無しさん
05/02/04 14:11:04すんげー噛み砕いて教えてくれた!
ありがとう!
ポインタのお勉強をしてみるかぁ
0324デフォルトの名無しさん
05/02/04 14:18:530325デフォルトの名無しさん
05/02/04 14:23:150326デフォルトの名無しさん
05/02/04 14:40:110327デフォルトの名無しさん
05/02/04 14:42:33http://www.teck.co.jp/gj/products/ane&boin/index.htm
0328デフォルトの名無しさん
05/02/04 15:02:47char *str[]={"abcdef", "ghijkl", "mnopqr"};
と定義したとき「b」だけを出力するならstr[0][1]でいいと参考書にあるのですが
これだとコンパイラは通っても実行結果が出てきません。
どのようにしたら「b」だけを出力できるのですか?
0329デフォルトの名無しさん
05/02/04 15:07:26どうやって出力しましたか?
ポインタはきっと関係ない。
0330デフォルトの名無しさん
05/02/04 15:08:12printfで出力するのなら%sではなく%cにしろ。
0331328
05/02/04 15:11:34pritnf("%s", str[n][1]);
です。nはint型で0が入ってます。
ちなみにstr[n]に置き換えると「abcdef」が出力できました。
■ このスレッドは過去ログ倉庫に格納されています