[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 10:52 / Filesize : 232 KB / Number-of Response : 957
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 18



1 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:39:50 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 17
pc11.2ch.net/test/read.cgi/tech/1185286631/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 94代目
pc11.2ch.net/test/read.cgi/tech/1185452895/

896 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 12:32:44 ]
realloc()を使うと、毎回確保し直すと思っている馬鹿が多いのか?
自分でわざわざ回数まとめてからrealloc()するようなコード書くより、
毎回realloc()する方が速いかもしれないぞw

897 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 12:39:00 ]
そんな当たり前の事言われても。

898 名前:894 mailto:sage [2007/09/16(日) 13:03:07 ]
>>895
まあ100%無意味って訳じゃないんだけどね。一応SQLの恩恵は受けているから。
でもバッチ系が全部、「始めてプログラムを組んだんじゃないか?」ってレベルなんだ。
>>894のコードも基本的に集計するだけだから、DBの設計さえ良ければ単純なSQLで済むはずなのになー。

ハッ、ここは愚痴スレじゃなかったなスマソ。

899 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 13:10:10 ]
気づいたんなら送信するな

900 名前:894 mailto:sage [2007/09/16(日) 13:16:21 ]
>>896
その話は聞いたことあるが、そういうレベルじゃない。
reallocその物を使わないで済ませられるような場面でやってるだよ。



901 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:00:29 ]
realloc()って新たに確保した場所にそれ以前のものをコピーするんじゃなかったっけ?
毎回やっているかは知らんが

902 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:06:55 ]
>>901
元の領域に連続した領域を確保できれば、単純な拡張でよいので、
コピーは省略出来る。

903 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:09:04 ]
>>901
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
void *ptr=NULL, *new_ptr;
int i, count=0;

for(i=1;i<=1000;i++){
new_ptr=realloc(ptr, i*100);
if(ptr!=new_ptr){
fprintf(stderr, "pointer changed. [%d]\n", i);
ptr=new_ptr;
count++;
}
}
printf("change count : %d\n", count);
free(ptr);
return 0;
}

904 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:10:12 ]
巨大な配列を宣言時に同じ値で初期化したいんですけどこういう場合に簡略化する書き方とかないですかね
void func()
{
static int array[3000] = { 0, .. ,0};
}

的な…




905 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:20:31 ]
{0}
っていうかstaticって自動的に0で初期化されなかったっけ?

906 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:33:31 ]
サンクス。うまくいきますた。

907 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:43:25 ]
グローバル変数、静的変数は宣言時に全ての要素が 0 で初期化される。
ローカルな配列は、宣言時に1つ(1要素)でも初期化を行うと残りが全て 0 で初期化される。

int a[3000]; // a[0]〜a[2999] まで全て 0
int b[3000] = {1, 2, 3}; // b[0]=1, b[1]=2, b[2]=3, b[3]〜b[2999]=0
int c[3000] = {1}; // c[0]=1, c[1]〜c[2999]=0
main(){
int d[3000]; // d[0]〜d[2999] まで全て不定値(適当な値)
static int e[3000]; // a と同じ
int f[3000] = {1, 2}; // bとかcと同じ
}

よく、ローカルな配列を 0 で初期化するために array[256] = {0}; とか書くが、
1要素でも初期化すると残りが 0 で初期化されることを利用しているだけ。
array[256] = {1}; と書いて全ての要素が 1 で初期化されると誤解するやつが多い。

任意の値で初期化させたければ、n次元の配列はn重のループを普通に書く。
C++ならalgorithmのfillなんかを使えばいい。


908 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 20:37:21 ]
>>904
staticなら自動的に0で初期化される。
関数内staticにするなら、他の値は難しいな。
呼び出しの都度初期化でいいならmemsetとかでも良いだろうけど。



909 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 20:39:25 ]
複数ファイルにソースを書くときのお作法を知りたいんだけど、わかりやすいところないかな

910 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 01:00:33 ]
>>909
ヘッダファイルから書き始める

911 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 02:30:43 ]
新しくコード書くとき
既存のファイルに加えるか
新しくファイル作成するか迷うんだけど
どういう基準でやったらいいですか?

912 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 10:25:01 ]
設計上モジュールが分かれてたらファイルを分ける。
CUnit使うなら1ファイルに1関数。

913 名前: ◆7qRx8xrwgo [2007/09/17(月) 11:51:39 ]
質問させていただきます。


円記号を表示します。 :\
アポストロフィを表示します。:\

と、出力したくて
#include <stdio.h>

int main(void)
{
    printf("円記号を表示します。 :%c\n", '\\');
    printf("アポストロフィを表示します。:%c\n", '\'');

    return 0;
}

でコンパイルしてみたのですが、
Sample5.c:5:12: warning: unknown escape sequence: '\216'
Sample5.c:6:12: warning: unknown escape sequence: '\216'
とエラーが出たのですが、どうすればエラーが表示されなくなりますか?

914 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 11:53:04 ]
>>913
表示

出力



915 名前:デフォルトの名無しさん [2007/09/17(月) 11:55:23 ]
「表」の後ろに¥を入れれば直るかも。

916 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 11:59:13 ]
OSとコンパイラは何?

917 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:03:44 ]
>>913
文字コード Shift-Jis の時
[表示] = 0x95 0x5C 0x8E 0xA6
0x5C = '\\'
0x8E = 0216 <- 8進数

\216 を解釈しようとして、そんなエスケープシーケンスがないという
*警告*がでているだけ

日本語対応しているコンパイラを使うほうが楽

918 名前:913 ◆7qRx8xrwgo [2007/09/17(月) 12:16:57 ]
>>914
本に表示と書いてありました

>>915
失礼ながら半信半疑で試したところ、仰るとおり直りました。

>>916
OS:Wndows XP HE SP2
コンパイラ: gcc(Cygwin)

>>917
解説ありがとうございます。今はコンパイラを変えたくないのでこのままでいこうと思います。
もしよろしければ、「表示」のように、気をつけた方がいい単語が他にもありましたら教えてください。

919 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:22:35 ]
>>918
―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃

920 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:26:19 ]
gcc に --input-charset=cp932 --exec-charset=cp932 オプションをつけてみ

921 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:32:32 ]
>>920 thx
MinGW (GCC.EXE (GCC) 3.4.2 (mingw-special)) でもいけたよ
さっそく CFLAGS に追加しておいた

922 名前:918 ◆7qRx8xrwgo [2007/09/17(月) 12:36:56 ]
>>920
仰るとおりに実行した所エラーが表示されることも無くコンパイルできました。感謝です。

923 名前:デフォルトの名無しさん [2007/09/17(月) 12:41:51 ]
皆さん、実際にC言語でどのようなソフトを書かれているんですか?



924 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:51:00 ]
OS書いていますけど?



925 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:53:14 ]
通信プロトコル。
OSIでデータリンクからセッションぐらいまで

926 名前:デフォルトの名無しさん [2007/09/17(月) 12:55:28 ]
どこにもしようしているおえすめいかいてない
あおえすをしいでかいてるのか
すごいなおまえ

927 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 13:01:33 ]
C言語は学校の授業や課題でしか使わんな
普段使うのはVC++かJavaかC#

928 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:43:27 ]
>>923
去年、一年くらい、10年くらい前に作られたシステムの保守要員やらされて、辟易した。

929 名前:デフォルトの名無しさん [2007/09/17(月) 16:20:36 ]
保守ってどんなことやるの?

930 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:40:25 ]
>>929
お客さんとこのシステムの構成が変わったりなんか要望があったら、それにあわせてコードを書き換えたりとか。
新規のお客さんもあったけど、すでにあるコードから必要なコードをコピペして、ちょっといじって
もって行ったりとかするだけ。

931 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:45:13 ]
ものすごくつまんなそうな仕事ですね

932 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:57:41 ]
つまらないうえに、すごいつらかった。
基本的にソースコードぐちゃぐちゃだし。


933 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:06:15 ]
今の現場、つまらないうえに、すごいつらい。
基本的にソースぐちゃぐちゃだし。

934 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 18:32:30 ]
既存のファイルのファイルスコープにある変数や関数を使いたい、
っていうんじゃないんだろうから、迷ったら別ファイルでいいんじゃないでしょうか?

ファイルを分ける弊害って、なにかあるでしょうか?




935 名前:934 mailto:sage [2007/09/17(月) 18:35:31 ]
リロードわすれてたっはっは〜

936 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 21:35:29 ]
>>933
でも、大事な仕事だよ。
今後はC言語でも保守の仕事が増えるんじゃないか!?
COBOLはすでにそうなっている。

しっかりとしたコーディング規約があって、その通りに作られていればいいんだが、
Cでの開発プロジェクトにはコーディング規約がないくて、各自各様のスタイルでコーディング
していることが多い。最近はそうでもないかもしれないけどね。

937 名前:933 mailto:sage [2007/09/17(月) 22:09:47 ]
>>934>>911に対するレス?

>>936
スタイル云々以前の問題でね、多分プログラミング自体の経験が無い人か、
少なくとも、スコープを分かってない人が書いたプログラムで、それが原因のバグとかもある。
おそらくテストもマトモにしてないと思われるよ。orz

>>911
で、「分ける分けない」て話は、スコープとも関わる話なのでスコープを理解すること。
関連性が強い物、似たような機能のものを集めるという分け方もある。
「モジュール強度 結合度 独立性」という言葉を調べると何かわかるかも。


938 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 22:18:54 ]
>>937
「モジュール強度 結合度 独立性」
なつかしい言葉だね

939 名前:デフォルトの名無しさん [2007/09/18(火) 01:53:17 ]
何方か、標準関数とポインタ変数についてを詳しく教えてくださる方はいらっしゃいますか?
自分が持ったいた参考書がこの2つの内容が掲載されてた部分が破けていて分からなくて困っています^^;



940 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 02:00:19 ]
>>939
ポインタ
www.geocities.jp/ky_webid/c/028.html
標準関数
always-pg.com/c/runtime_rd/

941 名前:デフォルトの名無しさん [2007/09/18(火) 02:05:59 ]
940>有難う御座います

942 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 02:07:38 ]
>>940
>「&」をアドレス演算子といいます。「&」がアドレスを表すので「"アンド"レス」と覚えておくと分かりやすいかも知れません。
なごんだ(´ー`)

943 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 02:10:59 ]
今更Cなんて初めて使う機会ないよ
OSやドライバを作るなら必要だが、そのレベルに達するまで恐らく5年以上は掛かるだろう




944 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 02:13:02 ]
がんばれば30日でできるらしいぞ



945 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 02:14:40 ]
あれかw

946 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 02:23:30 ]
C言語の言うことなら何でも聞きます

947 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 02:58:03 ]
ttp://always-pg.com/c/runtime_rd/string/wcslen.html
こちらの「文字列の文字数を求める」サンプルプログラムですが、
"Cプログラム" の長さは 6 が返るはずなんですが 11 が返ります。
なぜでしょうか? 環境は、linuxで gcc 3.3.6 です。


948 名前:デフォルトの名無しさん [2007/09/18(火) 03:01:06 ]
全角は2文字

949 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 03:26:23 ]
ちょっと語弊を招きかねない回答だなw
全角文字は2バイトなのでC標準のstrlenのようにバイト数を返す関数を使用した場合、文字数が得られるとは限らない。
ちゃんとロケールを設定すれば6になるはずだが?一字一句間違えずにコピペした?

950 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 03:31:49 ]
>>949
ダウンロードして展開した wcslen.c というファイルを euc-jp-unix にしてから
そのままコンパイルして実行してます。

951 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 03:58:59 ]
>>947-950
試してみたが、VC++では 6 が返ってきた。
cygwin gcc 3.4.4 ではコンパイルできなかった。
L"Cプログラム"; の L でパースエラー。

952 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 04:14:27 ]
え?ってかCなの?C++じゃなくて?
C標準に2バイト文字なんて概念あったっけ?

953 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 04:22:59 ]
wchat_t

954 名前:デフォルトの名無しさん [2007/09/18(火) 07:52:09 ]
質問させてくださりませ。
void parse_long_options (int _argc,
char **_argv,
const char *_command_name,
...);
の中の"..."の点三つはどういう意味なのでしょうか?
ご教授宜しくお願い致します。




955 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 08:01:23 ]
>>954
教授じゃなくて教示な

www.geocities.jp/ky_webid/c/057.html

956 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 08:30:14 ]
引数の数が可変であるってこと。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<232KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef