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

C言語なら俺に聞け(入門編)Part 63

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG?S★(520172)
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 62
http://pc12.2ch.net/test/read.cgi/tech/1269517734/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 135代目
http://pc12.2ch.net/test/read.cgi/tech/1269438098/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0153デフォルトの名無しさん2010/04/15(木) 17:55:43
>>152
メモリの0番地をリードしようとするから
0154デフォルトの名無しさん2010/04/15(木) 17:55:47
プログラミングはじめたいんだけどなにDLしたらいいの?
やりたいのはCです。
0155デフォルトの名無しさん2010/04/15(木) 17:58:17
最終的に何が作りたいの?
0156デフォルトの名無しさん2010/04/15(木) 17:59:15
>>154
Visual C++ 2008 Express Edition
0157デフォルトの名無しさん2010/04/15(木) 18:00:33
2010が旬だろw
0158デフォルトの名無しさん2010/04/15(木) 18:01:09
VC勧める人よくいるけど、導入やコード作成の手間考えれば
初学者にはちょっと敷居が高いんじゃないか?
0159デフォルトの名無しさん2010/04/15(木) 18:02:57
VC++も最初に落としたけど、 C言語を始めよう! からが初めやすかった
慣れればVC++で良いけど。エディタはサクラエディタに慣れると他のが使いにくくなった
0160デフォルトの名無しさん2010/04/15(木) 18:04:44
>>153
NULLポインタを渡したら(null)みたいに表示されるものと勘違いしていました. 馬鹿でした
0161デフォルトの名無しさん2010/04/15(木) 18:05:11
ありがとう、とりあえず挙がったの落としてみるよサンクス
0162デフォルトの名無しさん2010/04/15(木) 18:38:08
>>157
まだ英語版しかない
0163デフォルトの名無しさん2010/04/15(木) 20:02:52
ソース見てたんですけど
GPIO.F5 = ~GPIO.F5;の「= ~」ってどうゆう意味ですか?
よろしくお願いします
0164デフォルトの名無しさん2010/04/15(木) 20:08:41
=は代入、~はビット反転
0165デフォルトの名無しさん2010/04/15(木) 20:09:17
>>163
~は論理否定の演算子なので、~GPIO.F5はF5ビットを反転した値になる。
それをGPIO.F5へ代入している。
つまり、F5ビットが今の状態から反転するってこと。
0166デフォルトの名無しさん2010/04/15(木) 20:11:20
>>164 >>165
有難うございました
0167デフォルトの名無しさん2010/04/15(木) 20:55:49
>>165
論理否定と言ったら「!」のことを指す
「~」はビット反転とかビット否定とか1の補数とか
0168デフォルトの名無しさん2010/04/15(木) 21:04:30
パターンマッチ演算子のある言語から来るとぎょっとするかもねぇ
0169デフォルトの名無しさん2010/04/15(木) 21:38:48
配列の長さはどうやって求めるのですか?
0170デフォルトの名無しさん2010/04/15(木) 21:46:09
sizeof
01711692010/04/15(木) 21:47:00
>>170
thx
0172デフォルトの名無しさん2010/04/15(木) 22:04:54
危険な予感
0173デフォルトの名無しさん2010/04/15(木) 22:07:53
sizeof array / sizeof *array で配列の要素数が求められる
0174デフォルトの名無しさん2010/04/15(木) 22:19:04
1になるんですけど・・・と言ってくるのが目に見えるようだ
0175デフォルトの名無しさん2010/04/15(木) 22:19:34
0もありうる
0176デフォルトの名無しさん2010/04/15(木) 22:21:23
mallocしたポインタで、ポインタのサイズが返ってくるに一票
0177デフォルトの名無しさん2010/04/15(木) 22:28:46
2や4もあるで
0178デフォルトの名無しさん2010/04/15(木) 22:34:39
一つづつ数えろよ
0179デフォルトの名無しさん2010/04/16(金) 00:13:52
#define の ## って何ですか?
0180デフォルトの名無しさん2010/04/16(金) 00:16:00
連接
0181デフォルトの名無しさん2010/04/16(金) 00:18:54
連接ってなんだろう・・・
0182デフォルトの名無しさん2010/04/16(金) 00:37:46
#define cat(a, b) a##b

int func1();
int func2();

int main(){
  cat(func, 1)();  // -> func1();
  cat(func, 2)();  // -> func2();
  return 0;
}
0183デフォルトの名無しさん2010/04/16(金) 08:07:21
>>68
「それ以外」というのは main() がint を返さない場合のことですよね。
すなわち main() の型が実装によっていろいろかわることも許容しているではないでしょうか?
0184デフォルトの名無しさん2010/04/16(金) 08:12:22
>>183
main 関数の型を構成する要素(>>73,92参照)のうち、まず戻り値の型は int であるとし、
それ以外の要素について(つまり引数リストの型などについて)は実装依存であるということ。
0185デフォルトの名無しさん2010/04/16(金) 12:31:24
>>182
そうなんだ。
どうもありがとうございます。

では #defineの#は何ですか?
0186デフォルトの名無しさん2010/04/16(金) 13:02:28
学校卒業したけど、就職できなかったんだね。可哀想に。
0187デフォルトの名無しさん2010/04/16(金) 18:50:00
>>185
#defineの#はディレクティブといふ。

C言語のソースファイルのコードはそのままコンパイラに食わせる訳じゃなくて、
プリプロセスという課程を経てプリプロセッサが吐き出したコードをコンパイラに食わせている。
プリプロセッサに命令を与える(認識させる)文字がディレクティブ(#)。
注意しなきゃいけないのは、マクロ中の#と先頭に付いている#は全く別であるということだ。
ディレクティブとしての#は先頭に付いている。

例えば一番簡単な例が
#include"xxxx.h"
#includeはプリプロセッサにxxxx.hっていうヘッダファイルを読み込んで、
それそのものをコピペする

もし君がgccを使用しているならgcc -Eでコンパイルしてみるといい。
プリプロセス済みのソースコードが画面に吐き出されるハズだ。

命令には以下のようなものがある。
#include,#define,#if(#ifdef)+#else+#endif

#ifの条件判定には式を、#ifdefの場合は予め定義の何かを使う場合が多い。

後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。
0188デフォルトの名無しさん2010/04/16(金) 18:56:09
#define の右辺に登場する # 側を聞いているような気配
文字リテラル化する奴だな

#define foo(arg) #arg
foo(hogehoge) → "hogehoge"
0189デフォルトの名無しさん2010/04/16(金) 19:01:34
>>187
コード、コンパイラ、プリプロセッサ、ヘンダファイルってなんですか?

ディレクティブってエクスプローラーで見た時のフォルダのことですよね、それはわかります。
でもC言語との関係がわかりません。

gccでなくpcを使ってます、osはもちろんwindowsです。ですから試せません。

すみませんがよろしくお願いします。
0190デフォルトの名無しさん2010/04/16(金) 19:03:21
>>188
ありがとうございます。
0191デフォルトの名無しさん2010/04/16(金) 19:35:28
>>189
     ,.――――-、
     ヽ / ̄ ̄ ̄`ヽ、     勇者トンファーパーマン惨状
      | |  (・)。(・)|
      | |@_,.--、_,>       俺が着たからにはもう色々と駄目だ
      ヽヽ___ノ          
        /:::::::::::::::::l   /77
       /::::::::::i:i:::::::i,../ / | 
       l:::/::::::::i:i:::、:::/ / |  
       l;;ノ:::::::::::::::l l;.,.,.!  |  
        /::::::::::::::::l/ /  冂 
       /:::::::;へ:::::::l~   |ヌ|
      /:::::/´  ヽ:::l   .|ヌ|  
      .〔:::::l     l:::l   凵
      ヽ;;;>     \;;>
0192デフォルトの名無しさん2010/04/16(金) 20:06:08
おもしろいネタだこと
0193デフォルトの名無しさん2010/04/16(金) 20:29:35
#include <stdio.h>
int main(void)
{
long i=0;
for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
return 0;
}
(8) : error C2143: 構文エラー : ';' が '型' の前にありません。
(9) : error C2065: 'i' : 定義されていない識別子です。
(9) : error C2065: 'i' : 定義されていない識別子です。
(9) : error C2065: 'i' : 定義されていない識別子です。

どこがおかしいのか分かりません
たすけてくだしあ
01941932010/04/16(金) 20:33:11
↑
(8)は4行目です
0195デフォルトの名無しさん2010/04/16(金) 20:55:01
>>193
普通に動いたよ。
long int じゃないとだめとかかな?
0196デフォルトの名無しさん2010/04/16(金) 20:59:20
>>193
うちのGCCはWARNINGは出るがコンパイル自体は通ってる。

環境に何か問題あるんじゃまいか。

他にエラーとか、警告とか出てないのか?
0197デフォルトの名無しさん2010/04/16(金) 21:17:41
>>193
うちのコンパイラでもエラーはでないな。
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

06.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

/out:06.exe
06.obj
0198デフォルトの名無しさん2010/04/16(金) 21:19:18
>>184
otherwise を「引数リストの型などについて」の意味と解釈した理由を教えていただけませんか?
0199デフォルトの名無しさん2010/04/16(金) 21:27:17
>>193
{
/* 行番号から、ここに何かあると予想 */
long i=0;
0200デフォルトの名無しさん2010/04/16(金) 21:43:23
(4) : error C3872: '0x3000': この文字を識別子で使用することはできません
(5) : error C2143: 構文エラー : ';' が '型' の前にありません。
(6) : error C2065: 'i' : 定義されていない識別子です。
(6) : error C2065: 'i' : 定義されていない識別子です。
(6) : error C2065: 'i' : 定義されていない識別子です。

こうならできたけどなぁ
0201デフォルトの名無しさん2010/04/16(金) 21:48:36
>>187
ほう、ディレクティブっていうのか。
10年C使ってて初めて知ったぜ
0202デフォルトの名無しさん2010/04/16(金) 21:55:43
>>200
何で最初に
(4) : error C3872: '0x3000': この文字を識別子で使用することはできません
これを書かなかったんだ……

何処かに全角文字使ってる。
多分long i=0;の辺り
0203デフォルトの名無しさん2010/04/16(金) 22:03:40
>>200
4-7行目あたりに、他のコード(そこだけなら動く)があるんじゃないか?
で、今度は、それを消した時に、全角文字が残って、
違うエラーがでたんじゃないのか?
0204デフォルトの名無しさん2010/04/16(金) 22:06:28
あ、ちがうちがう。>>200は>>193じゃない。
まぎらわしくてすまん。
同じメッセージを出したくて、つい。
0205デフォルトの名無しさん2010/04/16(金) 22:18:35
可能性は∞。

全角文字がある可能性もあるし、人間には見えない文字が紛れ込んでいる可能性だってある。
或いはコンパイラが賢すぎてfor内の条件が1度も満たされない事に気付いてexeを生成するのを拒否してるのかもしれん。
0206デフォルトの名無しさん2010/04/16(金) 22:22:09
>>204
同じメッセージを出したいなら、こんな感じ。

#include <stdio.h>
int main(void)
{
char buf[] = "Hello, world!";

printf( "%s\n", buf );

long j=0;
for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
return 0;
}
02071932010/04/16(金) 22:22:49
すいません
再起動したら直りました
0208デフォルトの名無しさん2010/04/16(金) 22:25:02
Hello worldに書き換えた時に、変な消し方をしてしまった…orz
long j=0; // ×
long i=0; // ○
0209デフォルトの名無しさん2010/04/16(金) 22:29:16
>>206
ああ、その手があったかw
0210デフォルトの名無しさん2010/04/16(金) 22:30:27
>>207
んなアホな…
0211デフォルトの名無しさん2010/04/17(土) 13:17:06
>>187
> 後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。

これは何ですか?
0212デフォルトの名無しさん2010/04/17(土) 13:19:25
処理系依存の命令用に用意してあるもの
0213デフォルトの名無しさん2010/04/17(土) 23:47:08
6桁の数字を入力して、その数字の金額の金種を出力するプログラムを作っているのですがうまくいきません
とりあえずここまで作ったのですが…

#include <stdio.h>

int main(void) {
int x[9][2] = {
{ 10000, 0 },{ 5000, 0 },{ 1000, 0 },{ 500, 0 },{ 50, 0 },{ 10, 0 },{ 5, 0 },{ 1, 0 }
} ;
int n,k ;

printf("6桁の数字を入力してください \n");
scanf("%d",&n);

printf("%d円は \n",n);

for( k=0 ; k<9 ; k++ ){
x[k][1] = n/x[k][0] ;
n = n%x[k][0] ;
}

for( k=0 ; k<3 ; k++ ){
printf("%d円札は%d枚 \n", x[k][0],x[k][1] );
}
for( k=3 ; k<9 ; k++ ){
printf("%d円玉は%d枚 \n", x[k][0],x[k][1] );
}

return 0;
}
0214デフォルトの名無しさん2010/04/17(土) 23:50:54
2000円札はいつも忘れられる運命にあるな
0215デフォルトの名無しさん2010/04/17(土) 23:57:42
>>213
っ {100, 0},
0216デフォルトの名無しさん2010/04/18(日) 00:02:44
>>213
つ k<8
0217デフォルトの名無しさん2010/04/18(日) 00:07:22
配列の大きさに対して、紙幣と効果の種類が足りない。
その結果0で割ってるためにエラー。
0218デフォルトの名無しさん2010/04/18(日) 00:12:54
Cってよく高速っていうけどアセンブリほど早いわけじゃないでしょ
なんか中途半端なかんじなんだよね
0219デフォルトの名無しさん2010/04/18(日) 00:14:15
int main(int argc, char **argv) {
  unsigned long  num;
  unsigned char  a, b, c, d, e, f, g, h, i;

  num = strtoul(argv[1], NULL, 0);
  a = num / 10000;
  num %= 10000;
  b = num / 5000;
  num %= 5000;
  c = num / 2000;
  num %= 2000;
  d = num / 1000;
  num %= 1000;
  e = num / 500;
  num %= 500;
  f = num / 100;
  num %= 100;
  g = num / 50;
  num %= 50;
  h = num / 10;
  num %= 10;
  i = num / 5;
  num %= 5;

  fprintf(stdout, "%2u%2u%2u%2u%2u%2u%2u%2u%2u%2u", a, b, c, d, e, f, g, h, i, num);

  return EXIT_SUCCESS;
}
0220デフォルトの名無しさん2010/04/18(日) 00:14:24
最適化有効にしてアセンブリ出力させてみ?
侮れんものがあるぞ?
0221デフォルトの名無しさん2010/04/18(日) 00:14:38
>>218
無理して使わなくてもいいのにw
0222デフォルトの名無しさん2010/04/18(日) 00:14:49
じゃあアセンブラで全部作ってろよw
0223デフォルトの名無しさん2010/04/18(日) 00:16:29
よっぽど注意して設計しないとコンパイラの最適化には勝てないよな。
0224デフォルトの名無しさん2010/04/18(日) 00:19:58
ポータブルアセンブラだもん
0225デフォルトの名無しさん2010/04/18(日) 00:20:31
アセンブラで思い出した
MASMなんかの繰り返し展開マクロ同等の機能がプリプロセッサに欲しいことがある

gcc はプリプロセッサ段で可変引数使えるんだっけ?
0226デフォルトの名無しさん2010/04/18(日) 00:27:28
アセンブラより遅いCを使うくらいなら同じようにアセンブラより遅いJavaでやったほうがよくね?というJava脳の意見でした。
0227デフォルトの名無しさん2010/04/18(日) 00:29:09
>>218
CRC32 を C からアセンブリ言語に直しても 20% くらいしか速度は改善されなかった記憶が。
昨今のハードの進展を考えるとアセンブリのソースは保守性が悪すぎる。
マジレス失礼。
0228デフォルトの名無しさん2010/04/18(日) 00:29:36
>>223
それはCコンパイラに限ったこと?
他のコンパイラでも同じ事がいえるのなら特段Cのアドバンテージではないね
0229デフォルトの名無しさん2010/04/18(日) 00:30:07
>>226
確かに C で書く必然性はないわけで、お好きなように。
02302132010/04/18(日) 00:30:46
みなさんありがとうございます
まさか100円を忘れていたとは…
もっと注意して確認したいと思います
0231デフォルトの名無しさん2010/04/18(日) 00:32:47
>>230
べっべつにあんたの為なんかじゃないんだからねっ
0232デフォルトの名無しさん2010/04/18(日) 00:42:23
>>228
Cに限ったことじゃないが、Cは歴史が長いだけに最適化もすさまじい。
0233デフォルトの名無しさん2010/04/18(日) 00:46:44
>>232
一番すごいの?
それならちょっと嬉しい
0234デフォルトの名無しさん2010/04/18(日) 00:58:01
最適化ならVerilogの方が遥かに凄い。全くレベルが違う。
0235デフォルトの名無しさん2010/04/18(日) 01:30:00
設計が古いんだから・・・
0236デフォルトの名無しさん2010/04/18(日) 01:39:28
>>233
一番ってこたあないかもしれないけど、
現実をみて考えると相当なものがあるだろう。

C言語では微妙に不便を強いられる分、
ちゃんと見返りもあるんだねぇ
0237デフォルトの名無しさん2010/04/18(日) 07:56:41
しかしqsortなどがinlineじゃないので
ソートなどはC++に敵わない罠
0238デフォルトの名無しさん2010/04/18(日) 07:59:27
自前でソートすればCの方が速い可能性アリ。
0239デフォルトの名無しさん2010/04/18(日) 11:04:46
C++すげぇじゃねぇか。
あの変態文法で涙出そうになったけど。

ただC言語でもコンパイラ拡張でinlineを受け付けるものも
あるらしいから、それなら何とか・・・。
0240デフォルトの名無しさん2010/04/18(日) 13:20:01
qsortと比較関数の両方がinlineならいいだろうけどねえ
0241デフォルトの名無しさん2010/04/18(日) 13:26:10
C1Xでも標準ライブラリ改良する気ないみたいだしな。
qsortがインライン化されていないこともあるが、基本的なデータ構造を扱う関数群がないとか欠陥が多すぎ。
俺queueとか、my_listとかどんだけ無駄に再生産されてるんだよ。

Cのコミュニティーは本当に無能しかいない。
0242デフォルトの名無しさん2010/04/18(日) 13:41:47
静的型の言語は、テンプレートとかジェネリックみたいのが
ないとコレクション関係はつかえねーな。
0243デフォルトの名無しさん2010/04/18(日) 13:56:20
マクロでごり押しできなくはないけどな
まあ、普通は void* でなんとかするんだろうけど
0244デフォルトの名無しさん2010/04/18(日) 15:40:04
>>243
void * で書くのは間接呼び出しが発生して効率が落ちる。
0245デフォルトの名無しさん2010/04/18(日) 18:08:46
なら可変長構造体で
0246デフォルトの名無しさん2010/04/18(日) 18:23:10
qsortをinlineにする
笑ってしまった
0247デフォルトの名無しさん2010/04/18(日) 19:50:18
Cの仕様の範囲内でqsortの比較の最適化を期待するにはinlineしかないだろ
0248デフォルトの名無しさん2010/04/18(日) 22:36:22
>>247
> Cの仕様の範囲内でqsortの比較の最適化を期待するにはinlineしかないだろ
inlineはCの仕様じゃないって知らないのかお前はwwwwww
0249デフォルトの名無しさん2010/04/18(日) 22:50:15
C言語5年やっててinlineって言葉初めて見たんですが、
これはなんですか?釣りでもなく本当にわかりません・・・。
0250デフォルトの名無しさん2010/04/18(日) 23:05:09
>>249
「C99 inline」でググるんだ。
0251デフォルトの名無しさん2010/04/18(日) 23:08:24
>>249
inlineってC++からの輸入じゃね?
0252デフォルトの名無しさん2010/04/18(日) 23:11:41
>>249
インライン関数。

インライン関数とは、凄く簡単に説明すると

void func(void){
printf("test\n");
}

int main(int argc,char** argv){
func();
return 0;
}

↑のようなフザケタコードをコンパイラが
スマートに書き換える機能で、↑の糞コードのような場合

int main(int argc,char** argv){
printf("test\n");
return 0;
}

みたいな感じに書き直してくれる。
■ このスレッドは過去ログ倉庫に格納されています