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

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/09/30(土) 19:56:29
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け!  Part 129
http://pc8.2ch.net/test/read.cgi/tech/1156661024/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
0232デフォルトの名無しさん2006/10/21(土) 12:26:35
>>231
出せない奴乙
0233デフォルトの名無しさん2006/10/21(土) 12:37:23
>>231
理解してないのに口先だけで世の中渡ってこれたんだ?
それだけでも勲章モノだから、もう出しゃばらない方がいいと思うよ、うん
0234デフォルトの名無しさん2006/10/21(土) 12:40:20
>230
それが、その、数ヶ月前のコードは、自分が書いたものに見えないんです。
まるっきり記憶が飛んでいて。まるで他人のコードを見ているように
感じます。それを1−2日かけて思い出すと、どうにか理解できる
場合があります。やはり歳かな。
0235デフォルトの名無しさんNGNG?2BP(204)
>>233
まるで>>216がなにか理解しているかのような口ぶりだな。
0236佐賀2006/10/21(土) 12:48:35
はいはい佐賀佐賀
0237デフォルトの名無しさんNGNG?2BP(204)
むしろ>>216みたいなコトを言ってるヤツのほうが、
「口先だけで世の中渡ってる」感が強い。
0238デフォルトの名無しさん2006/10/21(土) 12:57:22
(´д`)
 〜ただいま>>218が真っ赤な顔で必死になっております〜
0239デフォルトの名無しさん2006/10/21(土) 12:58:54
>>229
コメントを書く際は、まず最初に

/* 【何でこんな処理しているのか】 */
/* ・・・ */

と書くルールを決める。
他に書きたい事があるだろうが、それらは後回し。
0240デフォルトの名無しさん2006/10/21(土) 13:06:32
>>239
んだね
プログラミング以前に戻って情報を引っ張ってこれるなら、
全体が、何を問題にして何を目標にどんな解決法でコードを導いたのか、一筆書き加えると後々楽だね
0241デフォルトの名無しさん2006/10/21(土) 13:21:02
コメントも構造化。
構造化というか、クラスのように階層化できるのがベストなんだが。
0242デフォルトの名無しさん2006/10/21(土) 13:21:36
コードの動作じゃなくて意図を書かないと意味ないな

i++; //カウンタをインクリメント

とかアホかと
0243デフォルトの名無しさん2006/10/21(土) 13:32:54
コメントの文法ならともかく作法はスレ違いだと思うの。
確か専用スレなかったっけ?
02442412006/10/21(土) 14:30:06
>>243
あるのか。是非逝ってみたいが、できれば誘導ヨロ。
0245デフォルトの名無しさん2006/10/21(土) 14:33:17
        コーディング規約 第2条
っ   ttp://pc8.2ch.net/test/read.cgi/tech/1068752664/
0246デフォルトの名無しさん2006/10/21(土) 14:36:21
サンクス。ちょっくら行ってくら。
0247デフォルトの名無しさん2006/10/22(日) 13:38:31
>>234
それは脳に血栓があるかもよ
場所によっては自己同一性にアクセスできなくなるから。
0248デフォルトの名無しさん2006/10/22(日) 19:41:24
絶えず自己進化を続けることに気付かない>>234
0249デフォルトの名無しさん2006/10/22(日) 21:24:02
char arr[1]={'A'};
arr
&arr
&arr[0]
&*arr
実質的に全部同じなんですが、違いを教えてもらえないでしょうか
0250デフォルトの名無しさん2006/10/22(日) 21:31:37
>>249
&arr だけ、型が違う。
0251デフォルトの名無しさん2006/10/22(日) 21:37:04
>>249
注意せよ、「実質的に」にひどい罠がある
0252デフォルトの名無しさん2006/10/22(日) 21:42:04
配列が式の中に現れると、原則として先頭要素へのポインタに変換される。
それを逆参照してまたアドレスを得ているだけなので、arrと&*arrは等価。

また添え字演算子は間接参照演算子などの糖衣構文であることから、&*arrと&arr[0]も等価。
故にarrと&arr[0]も等価。

&arrはというと、アドレス演算子が「式中で配列は先頭要素へのポインタに変換される」という規則の例外となっており、
配列そのものへのポインタが得られるということになっている。

まあ、ようするに&arrだけは結果の型がchar (*)[1]で、ほかは結果の型がchar *になる。
0253デフォルトの名無しさん2006/10/22(日) 22:08:36
>>250-252 ありがとうございます。
>>252 よくわかりました。
>&arrだけは結果の型がchar (*)[1]で、
>ほかは結果の型がchar *になる。
0254デフォルトの名無しさん2006/10/22(日) 22:14:57
>まあ、ようするに&arrだけは結果の型がchar (*)[1]で、ほかは結果の型がchar *になる。

これは嘘
printf("%u", sizeof arr);
0255デフォルトの名無しさん2006/10/22(日) 22:24:22
>>254
そのコードで何を証明したつもりなの?
0256デフォルトの名無しさん2006/10/22(日) 22:40:36
スルーでおk?
0257デフォルトの名無しさん2006/10/22(日) 22:57:43
痛い教えて君と同じことを言われたいかい?
0258デフォルトの名無しさん2006/10/22(日) 23:02:46
言われたい!!
0259デフォルトの名無しさん2006/10/22(日) 23:04:59
そんくらいやってみろ
0260デフォルトの名無しさん2006/10/22(日) 23:21:08
スルーでおk
0261デフォルトの名無しさん2006/10/22(日) 23:23:07
「sizeof arrの表示」と「arrや&arrの型」の間の関係が理解できる人はエスパー
0262デフォルトの名無しさん2006/10/22(日) 23:25:08
「サイズの違い」と「型の違い」の間の関係が理解できない人は C 使いにあらず
0263デフォルトの名無しさん2006/10/22(日) 23:26:52
また例の痛いヒトが現れたんだね。
0264デフォルトの名無しさん2006/10/22(日) 23:27:42
>>254は、他の人には見えないものが見えています。
0265デフォルトの名無しさん2006/10/22(日) 23:29:59
もう終わりかよ、つまんね
0266デフォルトの名無しさん2006/10/22(日) 23:32:35
エスパーって言葉どこのスレから拾ってきたの?
0267デフォルトの名無しさん2006/10/22(日) 23:32:55
たぶん、
char arr[1]={'A'};
arr
&arr
&arr[0]
&*arr
この次にやりそうなのを先に書いたんじゃないかな
とエスパー
0268デフォルトの名無しさん2006/10/22(日) 23:44:45
それはありえるけど、{'A'}
が怒っているように見えるのにエスパー
0269デフォルトの名無しさん2006/10/23(月) 00:35:29
>254
マジレスするとsizeofも配列そのものの大きさを返すことから、アドレス演算子同様あの規則の例外。
0270デフォルトの名無しさん2006/10/24(火) 15:06:26
入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムをポインタを使って作りなさい。
例) AB123cdを受け取ったら数字3、大文字2、小文字2

↑この答えお願いしますm(_ _)m
0271デフォルトの名無しさん2006/10/24(火) 15:43:24
#include<stdio.h>
#include<stlib.h>
#include<ctype.h>
int main(void) {
int numbers=0,upperCase=0,lowerCase=0;
char *p="AB123cd";
for( ; *p ; p++) {numbers+=(isdigit(p)!=0)?1:0;upperCase+=(isupper(p)!=0)?1:0;lowerCase+=(islower(p)!=0)?1:0}
printf("数字%n、大文字%n、小文字%n\n",numbers,upperCase,lowerCase)
return EXIT_SUCCESS;
}
0272デフォルトの名無しさん2006/10/24(火) 15:57:06
>>270-271
宿題スレ逝け阿呆。
0273デフォルトの名無しさん2006/10/24(火) 16:07:34
>>270
自分の間抜けさが露呈するから止めたほうがいいよ
0274デフォルトの名無しさん2006/10/24(火) 16:28:35
>>271
0275デフォルトの名無しさん2006/10/24(火) 16:29:59
↑すまん操作ミス、気にせんでくれ
02762702006/10/24(火) 16:37:39
すみません。

OSはWindows XP home SP1
グラフィックは GemeForce5200です。
ハードディスクは1が40ギガBで2が80ギガBです。
0277デフォルトの名無しさん2006/10/24(火) 16:43:03
>>276
それは本気で言っているのか
0278デフォルトの名無しさん2006/10/24(火) 16:46:57
>>277
あっ、Bはバイトです
0279デフォルトの名無しさん2006/10/24(火) 16:48:11
>>276
そのプログラムはGemeForce5200じゃ動かないよ
0280デフォルトの名無しさん2006/10/24(火) 17:53:58
ファイル(ASCIIやバイナリ)を高速でコピーしたいのだけれど、
WindowsでもUnixでも使える関数があれば教えてケロ。
0281デフォルトの名無しさん2006/10/24(火) 18:13:16
fopen, fread, fwrite, fclose
必要に応じてsetvbuf
0282デフォルトの名無しさん2006/10/24(火) 18:20:25
>281
ありがとうございます。
できれば、サンプルをアップロードしてもらえるとうれしい。
02832702006/10/24(火) 18:37:44
>>279
動きませんか・・・・ヒントは頂けたんで頑張ってみます。ありがとうございました。ペコリ
0284デフォルトの名無しさん2006/10/24(火) 18:51:49
異様な力場を感じる。
何かがおかしくなっていると感じるのだが
どこまでが正しかったのか分からない。
そんな経験ないだろうか。
0285デフォルトの名無しさん2006/10/24(火) 20:02:14
>>284
このスレが今そんな感じ
0286デフォルトの名無しさん2006/10/25(水) 00:21:28
関数ポインタにセットされている関数が、関数defかどうかを判断する処理を
mainと言う関数内で行いたいのですが、エラーが出てぜんぜんダメなんです。。。
誰か助けてください(泣)
わたしって馬鹿すぎですかね。。。
32bit処理系です(←関係ないですかね〜)


void ( *func )( void ) ;// 関数ポインタを宣言

void def( void ){//何か処理をする関数
}

void abc( void ){
func = &def ;// 関数defのアドレスをセット}
}

long check( void ){// 関数のアドレスを返す関数のツモリです
return( ( long )func ) ;
}

void main( void ){
if( check() == &def ){
//funcのの関数はdef
}
else{
//defでは無い
}
}
0287デフォルトの名無しさん2006/10/25(水) 00:31:56
すいませんが質問させてください。
キーボードから入力された文字列をHEXコードに変換するプログラムを書きたいんですけど
やりかたがさっぱりわかりません。
たとえばAと入力したとき、実際は0x41ですけどこれを0x0Aに変換したいんですがどなたか
アイデアをください。初心者なのでほんとお願いいたします。
0288デフォルトの名無しさん2006/10/25(水) 00:35:06
>>286
単なるwarnigじゃないんですか?
だとするとcheckのlongをvoid *にして(long)を取り払えばいいと思いますが。
0289デフォルトの名無しさん2006/10/25(水) 00:36:18
>>286 単純にabc()を呼んでないだけでは
0290デフォルトの名無しさん2006/10/25(水) 00:41:59
>>288
解答ありがとうございます。
明日会社で早速試してみます。

>>289
abc()は別の関数で呼んでいます、説明が悪かったと思います、申し訳ございません。
0291デフォルトの名無しさん2006/10/25(水) 00:46:04
>>287
distance = 'A' - 0x0A
putchar (getchar() - distance) ;
0292デフォルトの名無しさん2006/10/25(水) 00:52:16
スマソ
printf ("%X", (getchar () - distance)) ;
0293デフォルトの名無しさん2006/10/25(水) 01:13:18
>>292
ありがとうございます。俺の書き方が悪かったんですが、これだと0〜9まで
の入力がうまくいかないんですよ。16進数だから16通りのIf分岐
でできそうだけどもっとスマートにできないかなと・・・。
0294デフォルトの名無しさん2006/10/25(水) 01:34:02
>16進数だから16通りのIf

もちつけ。
頼むからもちついてくれ。
16進数で表現できるのは65536通りの数字なわけだが、1ビットごとに処理を分岐させるつもりかおまいさんわ。
0295デフォルトの名無しさん2006/10/25(水) 01:36:26
>>293
c2n(x){return (x&79)%55;}
0296デフォルトの名無しさん2006/10/25(水) 01:47:35
>>294
> 16進数で表現できるのは65536通りの数字なわけだが
オマエがおちつけ。
0297デフォルトの名無しさん2006/10/25(水) 01:48:55
>>295
そんな方法があったのか・・・
いつも0-9、a-f、A-Fの場合で条件分岐してやってたよ・・・
0298デフォルトの名無しさん2006/10/25(水) 01:51:17
>>294
落ち着かなくてイイ
ただこの世から消えてくれるだけでイイ
0299デフォルトの名無しさん2006/10/25(水) 02:52:12
16通りのif文なんて
保守担当者がリアルorzとなるのが目に浮かんで
オラなんだかとってもワクワクしちゃうぞ。
0300デフォルトの名無しさん2006/10/25(水) 03:30:35
switch caseのことかー!!
0301デフォルトの名無しさん2006/10/25(水) 05:41:45
16通りのifで驚くのは初級者
達人は16段のifを使う
0302デフォルトの名無しさん2006/10/25(水) 08:46:49
16段のfor文を書く俺がきましたよ。
0303デフォルトの名無しさん2006/10/25(水) 09:55:26
俺のターン!
>>302にgoto禁止を提示!
0304デフォルトの名無しさん2006/10/25(水) 10:52:54
おれならテーブルを使うな
それならキャラクタセットがASCII上位互換でなくてもOKだしなにより移植性が高い
0305デフォルトの名無しさん2006/10/25(水) 13:01:48
char s[10];
char* p = s;
�@
p + 100;
�A
p += 100;
�B
p += 100;
*p;
どの時点で未定義ですか?
それともすべて未定義?
0306デフォルトの名無しさん2006/10/25(水) 14:09:37
3じゃね
0307デフォルトの名無しさん2006/10/25(水) 14:23:07
別に
0308デフォルトの名無しさん2006/10/25(水) 14:29:24
未定義の動作を引き起こすのは3だろうけど
1から値は不定になるよ。(例えばNULLと判定されても文句は言えない)
正常な比較等ができると保証されているのはs+10まで。
アクセスできるのは*(s+9)まで。

それと機種依存文字はやめた方がいいぞ。
他の板ならともかく、こういう板では互換性に気を配るべきだ。
0309デフォルトの名無しさん2006/10/25(水) 16:57:59
うんこ、ぷりっ。
0310デフォルトの名無しさん2006/10/25(水) 19:51:27
>>293
ありがとうございました。無事解決しました。

みなさんありがとうございました。
0311デフォルトの名無しさん2006/10/25(水) 22:14:45
ファイルa.h
struct A{
 struct A *next;
};
ファイルb.c
struct A *aroot, *alist;
func_a(){
 aroot = (struct A *)calloc(1, sizeof(struct A));
 alist = aroot;
 func_b();
 alist = aroot;
 while(alist = alist->next != NULL){
  alistの要素を表示
 }
}
ファイルc.c
extern A *alist;
func_b(){
 while(){
  func_c(alist);
 }
}
func_c(struct A *list){
 list = (alist->next = (struct A *)calloc(1, sizeof(struct A)));
}

大体このような感じでalistの要素を表示のところでalistの中身を次々に出ることを期待したんですが、
1つしか出ません。
アドレスを調べてみるとfunc_cを読んですぐの時点でlistのアドレスが毎回arootのアドレスになってました(順々にアドレスが増えていっていて欲しい)
func_cでcallocした後のアドレスは順々に増えていっています
なぜ1回1回listのアドレスがarootのアドレスに戻ってしまっているのでしょうか?
上記の範囲で問題があるのでしょうか?それとも書いてない部分に問題があるっぽいでしょうか?
0312デフォルトの名無しさん2006/10/25(水) 23:33:51
なんかやりたい事が良く判らんないけど、
func_c(struct A **list){ 
  *list = (alist->next = (struct A *)calloc(1, sizeof(struct A))); 
}
って事?
0313デフォルトの名無しさん2006/10/25(水) 23:49:21
func_a(){
 aroot = (struct A *)calloc(1, sizeof(struct A));
 alist = aroot;
の辺りも意味不明だな
03143112006/10/26(木) 00:15:18
>>312
まさにそれっぽいです
試してみます

>>313
arootの領域を確保しておかないとnextに代入しようとしたときにエラーが出ると思ったので
確保してからalistがarootを指すようにしたんですが
どう書くのが正しかったのでしょうか?
0315デフォルトの名無しさん2006/10/26(木) 01:03:02
>>288
>>289

今日、早速試してみたら問題なくできました!!
本当にありがとうございました。

今まで4年間アセンブラで書いていて、急に環境がC言語になってしまって・・・
C言語は難しいです。。。
0316デフォルトの名無しさん2006/10/26(木) 01:34:14
Cのどこが難しいの?
0317デフォルトの名無しさん2006/10/26(木) 01:37:00
アセンブラで普通にプログラム書けるやつがC難しいって・・・
とりあえずインラインアセンブラで書いとけばいいんじゃね?
0318デフォルトの名無しさん2006/10/26(木) 01:42:57
>>316-317
ずっとアセンブラだけやってる人から見たら、そーゆーモノらしいよ。
とくにVBとかの高級言語になるともう完全にバイナリでの動作を
イメージ(する必要もないのに)できなくてギブアップしてしまうらしい。

まぁ、あれだ、彼らは言うなれば深海魚で浅い海にあがってくると破裂して死んでしまうんだよ。
0319デフォルトの名無しさん2006/10/26(木) 01:54:24
バイナリーでの動作をイメージするってどういうこと?破裂しそう。
0320デフォルトの名無しさん2006/10/26(木) 01:57:30
>>319
メモリ上にどのようにデータとコードが展開され、
レジスタがどのように使われるかわかんないと破裂しちゃうらしい。
0321デフォルトの名無しさん2006/10/26(木) 02:45:36
まさしく実装依存だ。コード中にマジックナンバー云々の域を越えてる。
int(ポインタ)が20バイトとか考えてるのかな。
それじゃ、破裂しちゃう。
0322デフォルトの名無しさん2006/10/26(木) 04:28:01
オレがたまに型無し言語(スクリプトとか)を使うときと同じ感じなのかな
コンパイルエラーが無いと破裂する
0323デフォルトの名無しさん2006/10/26(木) 05:34:59
ここはよく破裂するインターネッティングですね。
0324デフォルトの名無しさん2006/10/26(木) 08:21:52
確かに型なし言語は俺も破裂するわ
0325デフォルトの名無しさん2006/10/26(木) 08:41:24
型無し不安症候群とかこの際だからビョーキにしてしまおう
0326デフォルトの名無しさん2006/10/26(木) 08:44:37
WinAPIが形無しになったら病気にされても文句は言わないよ
0327デフォルトの名無しさん2006/10/26(木) 10:51:00
>>318
ポインタの型依存な加減算で嵌るらしい。
アセンブラにも似たのはあるけど(type ptr)、参照時の抜き出す大きさ解決だけだしな…
0328デフォルトの名無しさん2006/10/26(木) 11:12:40
そういう奴らに非手続き型言語やらせると面白そうw
0329デフォルトの名無しさん2006/10/26(木) 11:40:06
>>318
>イメージ(する必要もないのに)できなくて
不安になるんだろう。俺もVBやってると
「これNewしっぱなしで大丈夫なのか?」と不安になる事があった。
0330デフォルトの名無しさん2006/10/26(木) 12:27:00
どうすれば安心なわけ?
0331デフォルトの名無しさん2006/10/26(木) 12:30:46
>>329
不安になる必要はないぞ
ちゃんとリソースリークしてくれるから安心しろ
■ このスレッドは過去ログ倉庫に格納されています