トップページ⇒tech
1001コメント252KB

C言語なら俺に聞け! Part 101

■ このスレッドは過去ログ倉庫に格納されています
0001v(^o^i)d05/01/31 08:37:54
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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
>>231
どんどん伝染を繰り返し、馬鹿が増える。
馬鹿が増えると文明を維持することが困難になる。
文明を維持することが困難になると人類の繁栄に影響がでる。
人類の繁栄は最優先事項なので、馬鹿が伝染すると困る。
0233デフォルトの名無しさん05/02/03 17:28:19
ある可変引数関数の引数を、他の可変引数関数の引数に指定する事はできます?

void pp(char *fmt, ...) {
printf(fmt);
}

とか。



0234デフォルトの名無しさん05/02/03 17:36:45
>>233
printfの場合はvprintfを使え。
自作の関数の場合は初めからprintf/vprintfの用にva_list版も作って置け。
023523305/02/03 18:17:53
>>234
わかりました。ありがとうございます。
0236デフォルトの名無しさん05/02/03 22:15:39
>>227
名前なんかいちいち見ないよ
0237デフォルトの名無しさん05/02/03 22:21:23
あなたが、3つのドアの1つを選んで賞品を獲得するゲーム番組に出ているとします。
ドアの1つには賞品の車があります。残りの2つのドアはハズレでヤギがいます。
あなたがドアの1つ、たとえば1番ドアを選びます。
司会者は、それらのドアに何があるかを知っており、ヤギのドアを1つ、例えば3番ドアを開けてみせます。
そこで司会者があなたに、「2番ドアに変更してもいいですよ」といいました。
2番ドアに変えたほうがいいのでしょうか。


↑の確率を試行回数1万回くらいで実験してみたいんですが
どんな風に書けばいいの?
0238デフォルトの名無しさん05/02/03 22:47:28
>>237
ごく単純なマルコフ過程。
0239デフォルトの名無しさん05/02/03 22:48:36
変えた時と変えない時?
変えた時は1/2で変えない時は1/3。以上
0240デフォルトの名無しさん05/02/03 22:50:42
>>239
はい?もう一度良く考えて。
0241デフォルトの名無しさん05/02/03 22:55:27
>>240
え”!!違うの?ずっとそうだと思ってた
0242デフォルトの名無しさん05/02/03 22:56:20
3人の囚人A、B、Cがいる。三人とも処刑されることになっていたが、
王子が結婚するというので王様が一人だけ恩赦にしてやることになった。
誰が恩赦になるのか決定されたが、まだ囚人たちには知らされていない。
結果を知っている看守に、囚人Aが『BとCのうち、どちらかは必ず処刑
されるのだから、処刑される一人の名前を教えてくれても、私に情報を
与えることにはならないだろう。一人を教えてくれないか。』と頼んだ。
看守は、その言い分に納得して『囚人Bは処刑されるよ』と教えてやった。
囚人Aは、「はじめ自分の助かる確率は1/3だった。いまや助かるのは
自分とCだけになったので、助かる確率は1/2になった」と喜んだ。
さて、看守の返事を聞いた後の囚人の助かる確率はどれだけか?
0243デフォルトの名無しさん05/02/03 22:58:15
スレ違い
Cの話にアレンジできない低脳は氏んで
0244デフォルトの名無しさん05/02/03 22:59:20
質問です。
文字列とポインタに関してです。

ポインタの文字列というものを勉強しているとき、
char *ptr = "123";
ptr = "456";
と途中で書き換えられる。
と書いてありました。
しかしもう少しよんでいくと、ポインタの文字列リテラルの中身を書き換えてはいけない
と書いてありました。
いったいどういうことでしょうか?

ポインタで文字列を扱った場合、書き換えてはいけないのですか?
0245デフォルトの名無しさん05/02/03 23:00:27
>>242
237と問題違うし
0246デフォルトの名無しさん05/02/03 23:00:30
Cスレイラネごみ
0247デフォルトの名無しさん05/02/03 23:00:56
>>243
アレンジできてないのはお前一人
0248デフォルトの名無しさん05/02/03 23:01:18
>>237
どう言う確立で司会者が変更して良いというのか。
0249デフォルトの名無しさん05/02/03 23:01:34
>>244
どこに書いてた?
0250デフォルトの名無しさん05/02/03 23:02:42
>>249
明解C言語という本です。
0251デフォルトの名無しさん05/02/03 23:02:48
>>242
1/3
0252デフォルトの名無しさん05/02/03 23:02:51
何を書き換えた?か。
0253デフォルトの名無しさん05/02/03 23:03:01
>>237
司会者がどこが当たりか知っているのか?
それによっては条件が変わってくるぞ
0254デフォルトの名無しさん05/02/03 23:05:14
>>244
ソレはptrは書き換わってるが、"123"を書き換えてるわけじゃなく。
0255デフォルトの名無しさん05/02/03 23:05:28
>>253
書いてあるだろよ
0256デフォルトの名無しさん05/02/03 23:05:34
選んだ時点で1/3。
で、ハズレを教えてもらって残り2択となり、
選んだものがハズレの場合、変えた時点で
当たるわけだから、変えたときは2/3かな?
違う?

何言ってるかわからなくなった。
orz
025724405/02/03 23:07:00
>>254
456という文字列の先頭ポインタをさしているんですよね?
それは456という文字が連続してあるからでしょうか?
これが457だとエラーになるのでしょうか?
それならなっとくが出来ます。
0258デフォルトの名無しさん05/02/03 23:08:02
>>257
氏ねばいいのに
0259デフォルトの名無しさん05/02/03 23:08:48
>>237
変えるか変えないかの二択の時1/3、
再分配すると1/2じゃないかね
0260デフォルトの名無しさん05/02/03 23:09:41
>>258
御前が市ね。スレの雰囲気を崩すな。
低脳は困る。
0261デフォルトの名無しさん05/02/03 23:10:25
>>244

char *ptr = "123";

ptr = "456"; /* できる */
strcpy(ptr, "456"); /* できない */

ということじゃないの。
0262デフォルトの名無しさん05/02/03 23:11:28
早くアレンジしろ!!
コード書けねえバカクズばっかり!!!!!!!!!!!
0263デフォルトの名無しさん05/02/03 23:11:55
char *ptr = "123";

ptr = "456"; /* できる */
*ptr = '4'; /* できない */
0264デフォルトの名無しさん05/02/03 23:13:18
*ptr = '456';
026524405/02/03 23:15:55
なるほど!
よくわかりました。ありがとうございました。
0266デフォルトの名無しさん05/02/03 23:17:20
char *ptr= "早くアレンジしろ!!\nコード書けねえバカクズばっかり!!!!!!!!!!!";
0267デフォルトの名無しさん05/02/03 23:31:55
>>265
そんなんで分かっちゃだめだよん
0268デフォルトの名無しさん05/02/03 23:34:34
>>237

はじめにハズレを選んでいた場合、変えたら必ず当たる。
はじめにあたりを選んでいた場合、変えたら必ず外れる。

で、はじめにハズレを選ぶ確率は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:42
>>244

char *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:47
リテラルってこんな感じのことを代わりにやってもらうんだっけ?

char *point;
point=( char *)malloc( sizeof(char) * (strlen(str)+1) );
strcpy(point,str);
0272デフォルトの名無しさん05/02/03 23:58:42
そんな風に思ってるバカはお前だけ
0273デフォルトの名無しさん05/02/04 00:00:10
(´-`).。oO(どうやったらこの流れから>>271のような発想が出てくるんだろう……)
0274デフォルトの名無しさん05/02/04 00:00:38
僕もリテラルでつくった文字列は共有される場合があるから書き換えるとまずいと聞いた時があります
結局大丈夫なんですか?
0275デフォルトの名無しさん05/02/04 00:03:20
>>274
そんなレベルの問題じゃない
0276デフォルトの名無しさん05/02/04 00:04:12
>>274
>>273

日本語も理解できない池沼ですか?
0277デフォルトの名無しさん05/02/04 00:05:13
リテラルっておいしいんだよ。煮つけにしたりとか。はちみつ塗って焼いてもいいね。
0278デフォルトの名無しさん05/02/04 00:05:58
>>271
まぁ大体そんな感じだな。
0279デフォルトの名無しさん05/02/04 00:07:07
>>275
ま、実際に規格を作る段階で>>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
>>278
アフォ?
0282デフォルトの名無しさん05/02/04 00:14:17
>>280
エラー出してるんなら原因わかるでしょ。
0283デフォルトの名無しさん05/02/04 00:16:18
>>279
レベルが違うとはどうゆう違いなのでしょうか?
244さんが言う「ポインタの文字列リテラルの中身を書き換えてはいけない」
とは

char *p = "\n";
*p = '\a';

printf("\n");

がおかしくなる処理系の場合を指しているんじゃないんですか?
0284デフォルトの名無しさん05/02/04 00:18:48
おかしくならない処理系でも書き換えてはいけない。
0285デフォルトの名無しさん05/02/04 00:21:05
何でこんなバカなの…
028628005/02/04 00:21:53
>>282
解決方法がわからないから困ってるんです。

追加
・別関数の左右反転は正常にできる。
・画像サイズが大きいと発生というわけでも、小さいから発生と言うわけでもないみたいです。
0287デフォルトの名無しさん05/02/04 00:24:23
>>280
(1) y=0 の時に bminfo->biHeight-y はどこを指す?
(2) 4バイト境界の罠
0288デフォルトの名無しさん05/02/04 00:25:16
>>286
エラーとは何?
memcpyの前後で書かれるべき値が書かれてないってこと?
028928005/02/04 00:35:48
>>287
(1)の観点で、
bminfo->biHeight-y -1
としてみました。
解決できました。ありがとうございました。
0290デフォルトの名無しさん05/02/04 00:41:12
union {
 int a;
 struct {
  int b1;
  int b2;
 } b;
};

という構造で a と b1 は同じ領域を占めることって保証されてますか?
0291デフォルトの名無しさん05/02/04 00:42:20
>>290
保証されません。
0292デフォルトの名無しさん05/02/04 00:50:21
union {
 struct {
  int a1;
  int a2
 } a;
 struct {
  int b1;
  int b2
 } b;
};

でもこの場合a1とb1が同じ位置になることは保証されますよね
どうして結果が違うんでしょう??
0293デフォルトの名無しさん05/02/04 01:05:45
unchi
0294デフォルトの名無しさん05/02/04 09:22:15
コンパイルした後のexeファイルからソース見ることってできるます?
0295デフォルトの名無しさん05/02/04 09:23:13
コンパイルした後のexeファイルからソース見ることってできるます?
0296デフォルトの名無しさん05/02/04 09:23:34
できるません。
0297デフォルトの名無しさん05/02/04 10:06:01
source.c
----------------
#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:29
"b"がださすぎ。
0299デフォルトの名無しさん05/02/04 10:35:20
exeって書いてあったからね
0300デフォルトの名無しさん05/02/04 10:41:50
>>299
それがどう関係する?
0301デフォルトの名無しさん05/02/04 10:42:53
さっき人にwhile文の無限ループ時にはいる
1って何型?って聞かれたんですが・・・。
何型なんでしょう?
0302デフォルトの名無しさん05/02/04 10:48:59
>>301
while 云々関係なく「1」はint型
0303デフォルトの名無しさん05/02/04 10:49:05
int
0304デフォルトの名無しさん05/02/04 10:53:51
実行している自分自身の絶対パスを取得する方法って何でしょう?
LINUX版の「_pgmptr」とかないっすか?
0305デフォルトの名無しさん05/02/04 11:00:11
お前の環境はなんなんだ
0306デフォルトの名無しさん05/02/04 11:07:44
>>304
標準的な方法はない
0307デフォルトの名無しさん05/02/04 11:10:00
>>304
argv[0]
0308デフォルトの名無しさん05/02/04 11:15:47
「頼むから>>1のFAQに一通り目を通してくれよ」と切に思う今日このごろ
0309デフォルトの名無しさん05/02/04 12:53:43
>>307
それはOSに依存してるよ〜
UNIX系環境ではコマンドラインの一番目が来ちゃう
0310デフォルトの名無しさん05/02/04 13:05:37
GetModuleFileNameみたいなのがあればOK
UNIX系環境では知らん
0311デフォルトの名無しさん05/02/04 13:41:57
もう構造体とかオブジェクト指向がどうとかポインタとか
さっぱりわかりません
分けわっかんなああああああああああああああい
0312デフォルトの名無しさん05/02/04 13:47:11
>>311
あなたはプログラミングに向いていません。
0313デフォルトの名無しさん05/02/04 13:50:50
>>312
プログラミング関係ないよ。
0314デフォルトの名無しさん05/02/04 13:51:04
>>312
それを言うなぁ!!
日曜プログラマなのでちょこっとづつ理解していくさT〜T
0315デフォルトの名無しさん05/02/04 13:52:46
>>314
にゃんにゃん
0316デフォルトの名無しさん05/02/04 13:54:15
>>314
大原ゆきに教えてもらえ。
0317デフォルトの名無しさん05/02/04 13:56:21
>>315
にゃふうん

>>316
だれだよソレT〜T
0318デフォルトの名無しさん05/02/04 13:58:26
>>317
>>207
0319デフォルトの名無しさん05/02/04 14:05:23
>>311
構造体…一緒に使うデータなんかは纏めておいたほうが楽だよね?
オブジェクト指向…構造体についでにそれの処理法も纏めておくと
           中でなにやってるか気にせずに済んで楽♪
ポインタ…これはC言語及びC++言語のある意味最大の特徴
      俺は理論だけじゃ完全に理解できなかったので
      デバッガ使って何やってるか追い駆けた
0320デフォルトの名無しさん05/02/04 14:05:29
構造体とオブジェクト指向はなんとなーくわかった
クラスがどーとかうすーい記憶が。
ポインタなんて一生わかんね!
わかんなくてもAPI使えるからいいもん!

>>318
にゃん抜きな人なのね
ありがと。
0321デフォルトの名無しさん05/02/04 14:09:56
>>319
      ,,、,、、,,,';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
>>319
オブジェクト指向の説明間違っているぞ。
0323デフォルトの名無しさん05/02/04 14:11:04
>>319
すんげー噛み砕いて教えてくれた!
ありがとう!
ポインタのお勉強をしてみるかぁ
0324デフォルトの名無しさん05/02/04 14:18:53
俺はi386アセンブリのソース書くようになって初めてポインタを理解した。
0325デフォルトの名無しさん05/02/04 14:23:15
基本情報用にCASLIIをやってポインタがどういうものかわかった
0326デフォルトの名無しさん05/02/04 14:40:11
俺の姉さんはボインだ
0327デフォルトの名無しさん05/02/04 14:42:33
>>326
http://www.teck.co.jp/gj/products/ane&boin/index.htm
0328デフォルトの名無しさん05/02/04 15:02:47
ポインタ関連で質問。

char *str[]={"abcdef", "ghijkl", "mnopqr"};

と定義したとき「b」だけを出力するならstr[0][1]でいいと参考書にあるのですが
これだとコンパイラは通っても実行結果が出てきません。
どのようにしたら「b」だけを出力できるのですか?
0329デフォルトの名無しさん05/02/04 15:07:26
>>328
どうやって出力しましたか?
ポインタはきっと関係ない。
0330デフォルトの名無しさん05/02/04 15:08:12
>>328
printfで出力するのなら%sではなく%cにしろ。
033132805/02/04 15:11:34
>>329
pritnf("%s", str[n][1]);

です。nはint型で0が入ってます。
ちなみにstr[n]に置き換えると「abcdef」が出力できました。
■ このスレッドは過去ログ倉庫に格納されています